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*\]
应该可以。下面是一个代码分解:
(这是我为InDesign编写的一个实用程序的输出。)啊,就是这样。多谢大家,这真的让整个事情看起来不那么可怕。是的。用正统的英语说:基本上,它匹配一系列单词字符(其实际设置取决于你的GREP方言,但
[a-Za-z0-9]
),然后选择一组无限重复的“空格,单词,:
,单词”。方括号前后的空格是可选的。