一个匹配"的东西的正则表达式|更多|这里"但不是"某事|更多|这里|"

时间:2014-09-25 22:46:19

标签: regex

我正在努力找出符合以下条件的正则表达式:

[something|more|here]
[another|match]
[more|matches|of|any|length]

但是,我不希望它匹配:

[a|bad|example|]
[|another|bad|example]
[a|bad||example|again]

我目前拥有的是:

/\A:\[[a-zA-Z\|]*\]/

这不够严格,因为它只是寻找|之间的任何字母组合和[]符号。它不需要与||或前导或尾随|匹配。什么可能是匹配的好方法?

5 个答案:

答案 0 :(得分:3)

无需环顾四周:

/\[[a-z]+(\|[a-z]+)*\]/i

请参阅demo

这是匹配CSV输入的相当标准方法的变体;它采用以下的一般形式:

stuff(,stuff)*

答案 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)

表达

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

Demo


说明

  • \[[
  • 开头
  • (?!\|)否定前瞻以确保[
  • 后面没有|
  • (?:[^|\]]|\|(?!\|))*非捕获组重复0次以上:
    • [^|\]]除了|]
    • 之外的任何内容
    • |
    • \|(?!\|) |后面没有第二个|
  • (?<!\|)负面反馈以确保]前面没有|
  • \]]
  • 结尾

答案 4 :(得分:0)

您可以使用此模式:

\[[a-zA-Z]+(?:\|[a-zA-Z]+)*\]

有几种正则表达式的味道,不需要转出关闭方括号,所以你可以写:

\[[a-zA-Z]+(?:\|[a-zA-Z]+)*]

对于更一般的情况,不限于ascii字母,您可以使用:

\[[^\]|]+(?:\|[^\]|]+)*\]

\[[^]|]+(?:\|[^]|]+)*]