如何在满足条件时匹配角色?

时间:2013-07-28 02:09:14

标签: regex

说我有以下字符串:

[AttributeName value1:Foo value2:Bar]

AttributeName或valueX并不重要。我可以认为它们是一系列文字或数字字符。

我的问题如下:我如何匹配[AttributeName]以及

[AttributeName value1:Foo value2:Bar],但不是

[AttributeNamevalue1:Foo value2:Bar]?  我是正则表达式的新手,所以答案的一些细节会非常好。

我尝试了以下内容:

\[ *[a-zA-Z0-9_]+ *([a-zA-Z0-9_]+:[a-zA-Z0-9_]+)*\]

根据我的理解,匹配一个字符串,该字符串包含以'['开头的序列,后跟0或更多空格,后跟一个或多个字母数字字符,然后是0或更多空格。这个问题来了。 如果我使用*匹配0个或更多空格,则[AttributeNamevalue1:Foo value2:Bar]将匹配。但是,如果我使用+,则[AttributeName]将不会匹配,因为后面没有空格。 我怎样才能执行if-then-else类型的检查?我找到了一些消息来源,但没有一个以初学者友好的方式解释这个问题。

2 个答案:

答案 0 :(得分:2)

\[\s*\w+(\s+\w+:\w+)*\s*\]

应该有效。以下是按代码分类的细分:

  1. \ [\ S * \ W +(\ S + \ W +:\ W +)的 \ S \]
  2. \ [Literal opening square bracket
  3. \ s *任何空白区域;可能发生零次或多次;将采取最长的匹配
  4. \ w +任何单词字符(A..Z,a..z,_,0..9);可能会发生一次或多次;将采取最长的匹配
  5. (开始小组#1
  6. \ s +任何空格;可能会发生一次或多次;将采取最长的匹配
  7. \ w +任何单词字符(A..Z,a..z,_,0..9);可能会发生一次或多次;将采取最长的匹配
  8. :字面字符“:”
  9. \ w +任何单词字符(A..Z,a..z,_,0..9);可能会发生一次或多次;将采取最长的匹配
  10. )结束组#1
  11. *整个组#1可能出现零次或多次;将采取最长的匹配
  12. \ s *任何空白区域;可能发生零次或多次;将采取最长的匹配
  13. \]直接关闭方括号
  14. (这是我为InDesign编写的实用程序的输出。)

答案 1 :(得分:0)

你需要为它添加一个空格,如:

\[([a-zA-Z0-9_]+)(?:\s+)([a-zA-Z0-9_]+:[a-zA-Z0-9_]+(?:\s+))*\]

我为AttributeName添加了一个捕获组,为空格添加了一个非捕获组。