【问题标题】:high-level regular expression with not带有 not 的高级正则表达式
【发布时间】:2017-05-04 15:10:38
【问题描述】:

您好正则表达式专家,

我有以下文字

<[~UNKNOWN:a-z\.]> <[~UNKNOWN:A-Z\-0-9]> <[~UNKNOWN:A-Z\]a-z]

还有下面的reg expr

\[\~[^\[\~\]]*\]

它适用于文本中的第 1 组和第 2 组,但不适用于第 3 组。

第一组是

[~UNKNOWN:a-z\.]

第二个是

[~UNKNOWN:A-Z\-0-9]

第三个是

[~UNKNOWN:A-Z\]a-z]

但是 reg exp 找到以下文本

[~UNKNOWN:A-Z\]

我明白为什么并且我知道我必须在 reg exp 中添加以下规则:
以 '[' 和 '~' 字符开头并以 ']' 结尾,除非 ']' 前面有一个 '\'。所以我应该添加一个 NOT 表达式,但不确定如何。

有人可以帮忙吗?

谢谢,
五、

【问题讨论】:

标签: java regex


【解决方案1】:

为什么不简单:

<([^>]+)>?


Regex Demo

【讨论】:

  • 这比原始模式匹配更多,但这取决于可能的输入字符串是否有问题。例如,这将匹配&lt;abc&gt; 中的abc。但是,它不会匹配原始模式所匹配的 [~abc]
  • 感谢佩德罗的回复!老王是对的,我也需要'[~'和']'前导和尾随字符。
【解决方案2】:

这应该可以工作(第一行模式,第二行你的模式(忽略空格),第三行我的更改):

\[\~(?:[^\[\~\]]|(?<=\\)\])*(?<!\\)\]
\[\~   [^\[\~\]]           *       \]
    (?:         |(?<=\\)\]) (?<!\\)

你的正则表达式:

\[\~             # Literal characters [~
[^               # Character group, NONE of the following:
    \[\~\]       # [ or ~ or ]
]*               # 0 or more of this character group
\]               # Followed by ]

您的文字模式:[~,介于两者之间的所有内容,直到下一个],只要其中没有[~]

我的模式,只解释相关的变化:

\[\~             
(?:              # Non capturing group
    [^\[\~\]]    
    |            # OR
    (?<=\\)\]    # ], preceded by \
)*               
(?<!\\)\]         # ], not preceded by \

字面意思:和你的一样,加上]前面有\可以包含,结尾]前面不能有\

【讨论】:

  • 您好法老,感谢您的解决方案!我认为这是我需要的。一件小事是,如果我从 '[~UNKNOWN:A-Z]a-z]' 中删除尾随 ']' 字符,那么它将匹配在我的场景中不完全有效的 '[~UNKNOWN:A-Z]' 文本。这可以以某种方式控制吗?谢谢!
  • 我想出了类似 [\~(?:[^[\~]]|(?
  • 是的,这正是我会做的。我将其包含在我的答案中,以便可以复制所有反斜杠,它们在您的代码中丢失。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-22
  • 2016-08-06
  • 1970-01-01
  • 2011-12-21
  • 1970-01-01
  • 2013-10-07
相关资源
最近更新 更多