Regex 如何仅在满足条件时匹配字符?

Regex 如何仅在满足条件时匹配字符?,regex,Regex,假设我有以下字符串: [AttributeName value1:Foo value2:Bar] AttributeName或valueX不重要。我可以把它们看成是文字或数字字符的序列。< /P> 我的问题如下:如何匹配[AttributeName]以及 [属性名称值1:Foo值2:Bar],但不是 [属性评估值1:Foo值2:Bar]? 我对正则表达式还比较陌生,所以如果能详细了解一下答案,那就太好了 我尝试了以下方法: \[ *[a-zA-Z0-9_]+ *([a-zA-Z0-9_]+:[

假设我有以下字符串:

[AttributeName value1:Foo value2:Bar]
AttributeName或valueX不重要。我可以把它们看成是文字或数字字符的序列。< /P> 我的问题如下:如何匹配
[AttributeName]
以及

[属性名称值1:Foo值2:Bar]
,但不是

[属性评估值1:Foo值2:Bar]
? 我对正则表达式还比较陌生,所以如果能详细了解一下答案,那就太好了

我尝试了以下方法:

\[ *[a-zA-Z0-9_]+ *([a-zA-Z0-9_]+:[a-zA-Z0-9_]+)*\]
据我所知,它匹配一个字符串,该字符串包含以“[”开头的序列,后跟0个或多个空格,后跟一个或多个字母数字字符,然后又是0个或多个空格。 如果我使用
*
匹配0个或多个空格,则将匹配
[AttributeName评估值1:Foo值2:Bar]
。但是如果我使用
+
,则
[AttributeName]
将不匹配,因为后面没有空格。
如何执行if-then-else类型的检查?我找到了一些源代码,但没有一个能以初学者友好的方式解释这一问题。

您需要在其中添加一个空格,如:

\[([a-zA-Z0-9_]+)(?:\s+)([a-zA-Z0-9_]+:[a-zA-Z0-9_]+(?:\s+))*\]
我为AttributeName添加了一个捕获组,为空格添加了一个非捕获组

\[\s*\w+(\s+\w+:\w+)*\s*\]
应该可以。下面是一个代码分解:

  • \[\s*\w+(\s+\w+:\w+\s\]
  • \[文字开口方括号
  • \s*任何空白;可能出现零次或多次;将进行最长的匹配
  • \w+任何单词字符(A..Z,A..Z,Z,0..9);可能出现一次或多次;将采用可能最长的匹配
  • (从第1组开始)
  • \s+任何空白;可能出现一次或多次;将进行最长的匹配
  • \w+任何单词字符(A..Z,A..Z,Z,0..9);可能出现一次或多次;将采用可能最长的匹配
  • :文字字符“:”
  • \w+任何单词字符(A..Z,A..Z,Z,0..9);可能出现一次或多次;将采用可能最长的匹配
  • )端组#1
  • *整个组#1可能出现零次或多次;将进行可能最长的匹配
  • \s*任何空白;可能出现零次或多次;将进行最长的匹配
  • \]文字结束方括号

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

    啊,就是这样。多谢大家,这真的让整个事情看起来不那么可怕。是的。用正统的英语说:基本上,它匹配一系列单词字符(其实际设置取决于你的GREP方言,但
    [a-Za-z0-9]
    ),然后选择一组无限重复的“空格,单词,
    ,单词”。方括号前后的空格是可选的。