java - 如何在较大的表达式中匹配除冒号之外的任何字符(包括特殊字符)的字符串(前面没有反斜杠)?

标签 java regex regex-lookarounds

免责声明:我不认为这与 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/

相关文章:

java - 使用 "kiosk mode"创建 Phonegap 应用程序

Python:检查字符串是否符合特定格式

Java 正则表达式使用模式替换文本之间

regex - 找到 vim 中的环视位置 [可能的 VIM Bug]

java - unique(true) - 无法准备语句

java - 实现像JConsole这样的程序需要什么

java - 调用 RandomAccessFile 实例的 setLength 方法时出现无效参数错误

javascript - 捕获 url 的第一部分

javascript - 我如何在这个正则表达式中自己编写一种转义字符?

regex - 在正则表达式中重用后向字符进行多次连续替换