1

假设我有以下字符串:

[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]则将被匹配。但是如果我使用+, then[AttributeName]将不会匹配,因为后面没有空格。如何执行 if-then-else 类型的检查?我找到了一些来源,但没有一个以适合初学者的方式解释这个问题。

4

2 回答 2

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

应该管用。以下是逐个代码的细分:

  1. \[\s*\w+(\s+\w+:\w+) \s \]
  2. \[ 文字左方括号
  3. \s* 任何空白;可能出现零次或多次;将进行最长可能的匹配
  4. \w+ 任意单词字符 (A..Z, a..z, _, 0..9); 可能发生一次或多次;将进行最长可能的匹配
  5. (开始组#1
  6. \s+ 任何空白;可能发生一次或多次;将进行最长可能的匹配
  7. \w+ 任意单词字符 (A..Z, a..z, _, 0..9); 可能发生一次或多次;将进行最长可能的匹配
  8. : 文字字符“:”</li>
  9. \w+ 任意单词字符 (A..Z, a..z, _, 0..9); 可能发生一次或多次;将进行最长可能的匹配
  10. ) 结束组 #1
  11. * 整个 Group #1 可能出现零次或多次;将进行最长可能的匹配
  12. \s* 任何空白;可能出现零次或多次;将进行最长可能的匹配
  13. \] 文字右方括号

(这是我为 InDesign 编写的实用程序的输出。)

于 2013-07-28T02:18:59.700 回答
0

您需要为其添加一个空格,例如:

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

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

于 2013-07-28T02:16:26.830 回答