java - 正则表达式匹配模式并排除字符串的一部分

标签 java regex

我有一些字符串需要通过正则表达式进行匹配。我们有一个 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/

相关文章:

java - JodaTime-IllegalArgumentException : Invalid format: "Mon, 29 Oct 2018 15:17:19 +0000"

java - 如何将 url 图像添加到 JButton

java - 删除特定字符后的下一个字母?

regex - 正则表达式用于匹配特定单词并忽略换行

java - 链接 Spring CookieLocaleResolver 和 AcceptHeaderLocaleResolver

java - 为什么这个 Java 方法调用被认为是不明确的?

java - JFreeChart 网格线颜色

Java 帮助使用模式操作 anchor

c# - 你能建议一个正则表达式来捕获这段文字吗?

javascript - jQuery 替换 html 标签和链接之外的内容