免责声明:我不认为这与 What's the regex to match anything except a double quote not preceded by a backslash? 重复。 ,因为 OA 有她/他可以使用的定界双引号。
我正在尝试匹配 Java 中的单行字符串,该字符串采用伪代码中的以下形式,其中 [any!=:]
是“除了前面没有反斜杠的冒号之外的至少一个字符”的缩写。
[any!=:]::[any!=:]:[any!=:]
我不擅长正则表达式,但我检查了负向后查找并提出了(不是Java,而是常规正则表达式):
[^(?<!\\):]+:{2}[^(?<!\\):]+:[^(?<!\\):]+
这确实匹配类似
(1) asd::asd:asd
但是不匹配,例如
(2) asd\:asd::asd\:asd:ads\:asd
(但是,它应该)。
采取accepted answer对于上面链接的问题,我还尝试了以下操作。
([^(?<!\\):]|\\:)+:{2}([^(?<!\\):]|\\:)+:([^(?<!\\):]|\\:)+
这适用于(2),以及一些但不是全部特殊字符(根据 RegexPlanet )。当与 [c]::[c]:[c]
组合使用时,它确实适用的字符 [c]
例如 $
、"
、%
、&
、/
、+
。它不适用的字符有,例如 ?
、!
,)
,\
。
根据Wikipedia ,
The usual metacharacters are {}^$.|*+? and .
为什么我的正则表达式适用于某些元字符(因为它们显然是这样称呼的),而不适用于其他元字符?我如何“修复”我的正则表达式以考虑到那些不起作用的正则表达式?
最佳答案
如何使用这个:
(?:\\:|[^:])+:{2}(?:\\:|[^:])+:(?:\\:|[^:])+
Demo (我使用 ^
和 $
anchor 进行演示)
唯一需要解释的部分是“除冒号之外的任何字符(除非前面有反斜杠)”的逻辑:(?:\\:|[^:])+
。让我们来分解一下:
(?: # start non-capturing group
\\ # match \ literally
: # match : literally
| # OR
[^:] # match anything but :
)+ # repeat non-capturing group 1+ times
我们几乎一次寻找一个字符(在非捕获组中)并重复此逻辑 1+ 次。该字符可以是 \:
或任何东西,但 :
([^:]
)。请注意 \\:
必须是你的交替的第一 block ,否则 [^:]
将匹配反斜杠,这可能是转义冒号所必需的。
更新: 为什么不 ([^(?<!\\):]|\\:)+
工作吗?
简单地说,环视在字符类中不执行任何操作。那么让我们来分解一下:
( # start capturing group
[^(?<!\\):] # match anything but (, <, !, \, or :
| # OR
\\ # match \ literally
: # match : literally
)+ # repeat capturing group 1+ times
关于java - 如何在较大的表达式中匹配除冒号之外的任何字符(包括特殊字符)的字符串(前面没有反斜杠)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24815130/