编写Java正则表达式

时间:2014-01-29 12:42:20

标签: java regex

编写Java正则表达式时遇到问题,以下是匹配字符串的要求:

  • ' or abc:匹配
  • X' or abc:匹配
  • Good X' or abc:匹配
  • Good 'X' or abc:不匹配

我正在使用java.util.regex.Pattern和java.util.regex.Matcher。 match意味着java.util.regex.Matcher.matches()返回true。

这是我写的正则表达式:".*((((?<!\\')[^\\s\\']+))[\\'\\s]+(or|and)).*"。但它不起作用。

对于我的应用程序中的某些要求,我必须在正则表达式的开头和结尾使用“。*”

我是regex的新手,有人可以帮助我吗?

感谢。

3 个答案:

答案 0 :(得分:2)

从您的示例中,我猜您正在尝试检查字符串中是否只有一个'

正则表达式可以是^[^']*'[^']*$,使用matches方法可以缩减为[^']*'[^']*

  • [^']*:所有不是'
  • 的内容
  • ''
  • [^']*:所有不是'
  • 的内容

String[] a = {
    "' or abc",
    "X' or abc",
    "Good X' or abc",
    "Good 'X' or abc"
};

for (int i = 0; i < a.length; i++) {
    Pattern p = Pattern.compile("[^']*'[^']*");
    Matcher m = p.matcher(a[i]);
    System.out.println(m.matches());
}

输出:

true
true
true
false

但是,为此目的,您不需要PatternMatcher,只需使用

yourString.matches("[^']*'[^']*");

答案 1 :(得分:1)

这个使用负面预测的正则表达式通过了测试:

if (str.matches("^(?!(.*?'){2}).*"))

查看live demo

答案 2 :(得分:1)

如果你必须在表达式的开头使用。*,那么这个有效:

".*(?=(?<!Good 'X)' or abc$).*"

诀窍在于它使用“(?=”以“'或abc”结尾的表达式向前看,但前面没有“Good'X” - 使用负面的lookbehind“(?&lt;!”。< / p>