我要匹配以下字符串:
'% Wal-Mart's %'
不匹配
'% Wal--Mart's %'
或任何其他在'%和%'之间包含两个破折号的字符串。
当前我的正则表达式如下:
(?<='%)[ \w',&+-]*(?=%')
但这允许带两个破折号的字符串通过。
如何匹配包含字符和符号的某些组合的字符串(包括单个破折号),而不匹配其中带有两个破折号的字符串?
答案 0 :(得分:2)
您可以重复 group ,而不是重复字符集,该组首先包括两个破折号的负前瞻,然后是原始字符集:
(?<='%)(?:(?!--)[ \w',&+-])*(?=%')
答案 1 :(得分:0)
您可以使用否定的前瞻来断言所允许匹配的内容后面没有双破折号:
(?<='%)(?![ \w',&+-]*--)[ \w',&+-]*(?=%')
在Java中
String regex = "(?<='%)(?![ \\w',&+-]*--)[ \\w',&+-]*(?=%')";
那会匹配
(?<='%)
肯定的lookahead,可以断言之前是%'
(?!
负前瞻,断言随后发生的事并非
[ \w',&+-]*--
匹配character class [ \w',&+-]
中的任何字符,重复零次或多次,然后跟--
)
近距离否定预测[ \w',&+-]*
匹配字符类中的一个字符零次或多次(?=%')
肯定的前瞻性是%'