我正在努力找出符合以下条件的正则表达式:
[something|more|here]
[another|match]
[more|matches|of|any|length]
但是,我不希望它匹配:
[a|bad|example|]
[|another|bad|example]
[a|bad||example|again]
我目前拥有的是:
/\A:\[[a-zA-Z\|]*\]/
这不够严格,因为它只是寻找|
之间的任何字母组合和[]
符号。它不需要与||
或前导或尾随|
匹配。什么可能是匹配的好方法?
答案 0 :(得分:3)
答案 1 :(得分:1)
我会为此添加一些前瞻性断言:
(?!.*\|\|)(?!.*\|\])(?!.*\[\|)\[[a-zA-Z\|]+\]
基本上,您尝试不匹配3种组合:
a)||
b)[|
c)|]
这3个前瞻断言处理这个问题。如果您不熟悉前瞻断言,那么您可以阅读一些nice tutorials。我没有第一次得到它们,所以尝试阅读3-4篇关于这个主题的文章并观看一些YouTube视频,你会得到它:)
答案 2 :(得分:1)
简单,如:
\[([a-zA-Z]+(\|[a-zA-Z]+)*)\]
如果你想匹配空括号,你可以将?
放在最后:
\[([a-zA-Z]+(\|[a-zA-Z]+)*)?\]
UPD:忘了括号,修复了
答案 3 :(得分:0)
\[(?!\|)(?:[^|\]]|\|(?!\|))*(?<!\|)\]
\[
以[
(?!\|)
否定前瞻以确保[
|
(?:[^|\]]|\|(?!\|))*
非捕获组重复0次以上:
[^|\]]
除了|
或]
|
或\|(?!\|)
|
后面没有第二个|
(?<!\|)
负面反馈以确保]
前面没有|
\]
以]
答案 4 :(得分:0)
您可以使用此模式:
\[[a-zA-Z]+(?:\|[a-zA-Z]+)*\]
有几种正则表达式的味道,不需要转出关闭方括号,所以你可以写:
\[[a-zA-Z]+(?:\|[a-zA-Z]+)*]
对于更一般的情况,不限于ascii字母,您可以使用:
\[[^\]|]+(?:\|[^\]|]+)*\]
或
\[[^]|]+(?:\|[^]|]+)*]