我有一些字符串需要通过正则表达式进行匹配。我们有一个 java 应用程序,它从配置文件中读取正则表达式并获取两组字符串,其中的数量在同一配置中指定。
例如
CustomAction.523274ca945f.dialogLabel=Executing Custom Code...
将与
匹配(?m)^(?!#)\s*(\S*)\s*=\s*(\S*.*)
我需要的是选择第一组“CustomAction.523274ca945f.dialogLabel
”并排除中间的随机字符串,这样我最终会得到类似“CustomAction.dialogLabel
”的内容code>"或 "CustomAction..dialogLabel
"以及除随机字符串之外的任何其他组合。
我没有我正在使用的 java 应用程序的源代码。这是一个应用程序,我可以为其创建一个配置文件,在其中指定一个模式和两个组,然后应用程序选择它们
pattern: (?m)^(?!#)\\s*([^.=\\s]*)\\.(?:[^.=\\s]*\\.)?([^.=\\s]*)\\s*=\\s*(.*?)\\s*$ key_group: 1 value_group: 2
我只能为每个键指定一个组,为每个值指定一个组。根据此模式,应用程序选择 key_group 作为键,选择 value_group 作为其值。
我不希望中间有垃圾,因为它是随机的,每次都会更改 key 。
最佳答案
两种方法;首先假设您的属性(property)有三项长,只需将您的第一个 (\S*) 替换为:
(\S+?)\.\S+?\.(\S+)
注意,我还将 * 更改为 +,因为将“..”作为属性的一部分是没有意义的,我还使用了非贪婪限定符,但没有它们它仍然可以正常工作。然后您可以使用适当的组号来重建调整后的属性。第二种方法假设您的随机字符串是十六进制数字(看起来是)并且属性的非随机部分不包含数字:
((?:\S+.)*)(?:[0-9A-Fa-f]+.)?((?:\S+.?)+)
因此,第一组应该拾取随机数之前的所有内容(包括尾随点),第二组将吃掉随机数,然后第三组将匹配剩余的字符串(如果没有随机数部分,则匹配整个字符串) )。
编辑
根据问题的更新描述并且仅匹配两个组,我的答案是这是不可能的。在正则表达式中,没有“删除”部分匹配的机制。从问题定义来看,不包含的键部分位于其他文本的中间,即要匹配的一般模式是:
((a)(?:b)(c))
由于我们无法对“b”进行预处理或后处理,“b”将始终是包含 a 和 c 的较大匹配组的一部分,因此它是非匹配组的事实不会影响较大组。
关于java - 正则表达式匹配模式并排除字符串的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3061162/