我有这个正则表达式(由别人提供),我需要用匹配的字符串进行测试。
"(?<=[H|h]at [\'|\""]).*?(?=[\'|\""])"
但是,我不知道它如何匹配
我认为"Hat 'test'"
可以做到,但是不匹配:
能给我一些指导吗?
谢谢
答案 0 :(得分:1)
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 [\'|\""]
似乎写得不好
[H|h]at
将与“帽子”,“帽子”和“ | at”匹配。如果只需要“帽子”和“帽子”,则“ |”应该删除。
|
在方括号中不视为“或”,因为它们旨在列出可能的匹配项[\'|\""]
也是同一问题的受害者,不需要转义符。匹配“帽子”和引号的更好方法是:
[Hh]at\s['"]
接下来,它想要匹配任何内容,因此它使用.*?
?
使它变得 lazy ,这意味着在下一步之前它将尽可能少地匹配。
最后,它使用先行查找结束语。同样,陷入与上述相同的问题。 (?=[\'|\""])
应替换为:
(?=['"])
似乎谁写正则表达式都犯了一些错误。这是Demo,其中包含我的更改,这是Demo,其中包含我的更改。我在Pete的答案中包含了示例字符串,以帮助显示更改。