反向正则表达式,提前查找匹配的字符串

时间:2018-07-10 18:49:00

标签: regex

我有这个正则表达式(由别人提供),我需要用匹配的字符串进行测试。

"(?<=[H|h]at [\'|\""]).*?(?=[\'|\""])"

但是,我不知道它如何匹配

我认为"Hat 'test'"可以做到,但是不匹配:

http://regexr.com/3s879

能给我一些指导吗?

谢谢

2 个答案:

答案 0 :(得分:1)

many possible matches中有:

Hat 'pretty much anything in apostrophes'
hat 'pretty much anything in apostrophes'
|at 'pretty much anything in apostrophes'
Hat |pretty much anything in pipes|
hat |pretty much anything in pipes|
|at |pretty much anything in pipes|
Hat "pretty much anything in double quotes"
hat "pretty much anything in double quotes"
|at "pretty much anything in double quotes"
Hat ""pretty much anything in double double quotes""
hat ""pretty much anything in double double quotes""
|at ""pretty much anything in double double quotes""
Hat "and pretty much anything in any combination of those|
hat |and pretty much anything in any combination of those'
|at ""and pretty much anything in any combination of those"

和实际匹配的文本是定界字符(('|"|""|\|))之间的任何字符。

对于它的价值,如果您有机会在代码库中重写此代码,那么现在可能是一个合适的时机。 :)

答案 1 :(得分:1)

我们可以分解一下。


首先,我们似乎要确保在匹配的任何内容之前先加上单词“ hat”或“ Hat”。

  • (?<=...)是一种回溯,意味着它可以确保内容在我们比赛之前就存在。

  • [H|h]at [\'|\""]似乎写得不好

    1. [H|h]at将与“帽子”,“帽子”和“ | at”匹配。如果只需要“帽子”和“帽子”,则“ |”应该删除。
      • |在方括号中不视为“或”,因为它们旨在列出可能的匹配项
    2. [\'|\""]也是同一问题的受害者,不需要转义符。

匹配“帽子”和引号的更好方法是:

[Hh]at\s['"]

接下来,它想要匹配任何内容,因此它使用.*?

?使它变得 lazy ,这意味着在下一步之前它将尽可能少地匹配。


最后,它使用先行查找结束语。同样,陷入与上述相同的问题。 (?=[\'|\""])应替换为:

(?=['"])

似乎谁写正则表达式都犯了一些错误。这是Demo,其中包含我的更改,这是Demo,其中包含我的更改。我在Pete的答案中包含了示例字符串,以帮助显示更改。