【问题标题】:Negative Lookahead Optional Matching负前瞻可选匹配
【发布时间】:2022-01-27 17:33:16
【问题描述】:

我正在尝试使用一种模式来查找某个单词,然后匹配该单词后面的一些字符,然后是一个可选的短语。可选短语在其自己的捕获组中,不应被一些字符捕获。我的例子如下:

(test((.(?!hi)){0,5}))(hi)

我已经在各种配置中尝试过这个和其他配置,并且给定输入字符串“test hi”,这将自己匹配“test”,但我无法让它匹配可选捕获组中的“hi”。

编辑:第二个例子

(test((?!tst).{0,5}))(tst)?(hi)
在“test tst hi”上运行它会正确得到 3 个组,但是,第 1 组将包含“test tst”,它应该只包含“test”。在这种情况下,第 2 组和第 3 组是正确的。

【问题讨论】:

  • 您能否提供更多示例(预期的输入和输出)?
  • @rikyeah 我已经添加了第二个,虽然它并没有太大的不同。
  • 我还是不明白你的问题……你能改写一下整个吗?
  • “匹配一定数量的字符” - 在多少之间?您的正则表达式似乎暗示介于 0 和 5 之间(但 0 不是“某个数字”)。如果您包含初始字符串的示例以及您期望从中提取的内容会更好。您在第一段中对问题的描述似乎与以下示例不匹配?并且正则表达式可能只会让事情变得混乱......你为什么要捕获最初的单词?为什么是负前瞻?
  • 我有一个正则表达式模式,它正在寻找特定的前缀,一旦我找到该前缀,我想找到它后面的任何 {1,10} 左右的字符。除了,如果我找到某种可选模式(嗨)?在第一种情况下,我希望它停止上升到 {1,10} 并在可选组中保留“hi”,而不是被 {1,10} 组捕获。

标签: regex


【解决方案1】:

您的第一个模式不包含正确调和的贪婪令牌,它应该看起来像

(test)((?:(?!tst).){0,5})(hi)?
#     ^^^^^^^^^^^^^^^^^^^ 

请参阅regex demo详情

  • (test) - 第 1 组:test
  • ((?:(?!tst).){0,5}) - 第 2 组:任何一个单个字符,出现 0 到 5 次,尽可能多,但不会开始 tst 字符序列
  • (hi)? - 第 3 组(可选):hi

第二个正则表达式有更多问题,最糟糕的是你没有考虑tsthi之间的空格。应该是

(test)((?:(?!tst).){0,5}?)(?: *(tst))?(?: *(hi))?

请参阅regex demo详情

  • (test) - 第 1 组:test
  • ((?:(?!tst).){0,5}?) - 第 2 组:任何一个单个字符,出现 0 到 5 次,尽可能少,但这不会启动 tst 字符序列
  • (?: *(tst))? - 一个可选的非捕获组,匹配零个或多个空格的可选序列,然后将tst 捕获到第 3 组
  • (?: *(hi))? - 一个可选的非捕获组,匹配零个或多个空格的可选序列,然后将hi 捕获到第 4 组。

【讨论】:

    猜你喜欢
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多