如何将正则表达式与字符和某些符号的任意组合匹配,除了'%和%'之间连续两个破折号

时间:2018-09-06 00:22:33

标签: java regex

我要匹配以下字符串:

'% Wal-Mart's %'

不匹配

'% Wal--Mart's %' 

或任何其他在'%和%'之间包含两个破折号的字符串。

当前我的正则表达式如下:

(?<='%)[ \w',&+-]*(?=%')

但这允许带两个破折号的字符串通过。

如何匹配包含字符和符号的某些组合的字符串(包括单个破折号),而不匹配其中带有两个破折号的字符串?

2 个答案:

答案 0 :(得分:2)

您可以重复 group ,而不是重复字符集,该组首先包括两个破折号的负前瞻,然后是原始字符集:

(?<='%)(?:(?!--)[ \w',&+-])*(?=%')

https://regex101.com/r/zDZJsy/1

答案 1 :(得分:0)

您可以使用否定的前瞻来断言所允许匹配的内容后面没有双破折号:

(?<='%)(?![ \w',&+-]*--)[ \w',&+-]*(?=%')

在Java中

String regex = "(?<='%)(?![ \\w',&+-]*--)[ \\w',&+-]*(?=%')";

Regex demo

那会匹配

  • (?<='%)肯定的lookahead,可以断言之前是%'
  • (?!负前瞻,断言随后发生的事并非
    • [ \w',&+-]*--匹配character class [ \w',&+-]中的任何字符,重复零次或多次,然后跟--
  • )近距离否定预测
  • [ \w',&+-]*匹配字符类中的一个字符零次或多次
  • (?=%')肯定的前瞻性是%'

Java Demo