我有一个格式一致的行,它们本质上是分隔的字段/值对,我需要使用单个正则表达式来比较两个字段的值,如果它们相同则进行匹配。我不需要这些值,只需要匹配/不匹配比较。这里有两个例子,第一个应该匹配,第二个不应该匹配。
- @@field1@@someValue@@field2@@someValue@@otherField@@otherValue
- @@field1@@someValue@@field2@@someDIFFERENTValue@@otherField@@otherValue
我可以匹配已知模式上的任何字段或值,并且可以使用环视来执行 AND 运算。
但我不知道如何提取并保存某些模式匹配的值,例如 field1@@(.*?)@@
,然后在表达式中使用该“someValue”,将其与 field2@@(.*?)@@
预先感谢您的帮助。
最佳答案
您可以使用
@@field1@@([^@]*)@@field2@@(?=\1@@)
@@field1@@((?:(?!@@).)*?)@@field2@@(?=\1@@)
如果值内容中不能有@
,则使用前者。否则,使用后一个正则表达式。
请参阅regex demo
详细信息
@@field1@@
- 文字字符串([^@]*)
- 捕获组 1(稍后在模式中,可以使用\1
反向引用来引用它):任何 0 个或更多字符除了@
之外
@@field2@@
- 文字字符串(?=\1@@)
- 紧邻当前位置的右侧,必须有与第 1 组中捕获的值相同的值,后跟@@
。如果可能出现字符串结尾,请替换为(?=\1(?:@@|$))
。
(?:(?!@@).)*?
模式“大致”表示除 @@
之外的任何文本,它实际上匹配任何单个字符(换行符除外),出现次数尽可能少,不会启动 @@
字符序列。
关于正则表达式比较一行中的两个子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63193246/