在java中编写正则表达式

时间:2012-02-09 12:46:41

标签: java regex

这是关于编写正则表达式以满足给定条件。

条件是:

  1. 如果段落中有特定的单词,我想返回true / false。
  2. 这个词可以在任何地方(开头,中间或结尾)
  3. 它只应返回有异常的整个单词。单词可以在(或)后面只跟一个特殊字符,例如,。;()[] {}等
  4. 此外,它不区分大小写搜索。
  5. 在下面的代码中,我正在寻找一个单词Positive。我在正则表达式中硬编码了字符串。理想情况下,在这种情况下,输出应为false,但它返回true。 所以我不知道该怎么做。

    String inputStr = "ssdf Positiveasd asd sdfewrewr asd";  
    inputStr = inputStr.toUpperCase();  
    
    String patternStr = "[^a-z]*[\\s]?[^\\d\\w]?[POSITIVE\b]+[^a-z]*";  
    Pattern pattern = Pattern.compile(patternStr);  
    
    Matcher matcher = pattern.matcher(inputStr);  
    boolean matchFound = matcher.matches();  
    
    System.out.println(matchFound);  
    

7 个答案:

答案 0 :(得分:1)

你的一个问题是\b表示“退格符”(显然不存在于你想要匹配的字符串中)。

你想要\\b(正则表达式引擎在字符串处理完成后会收到\b(字边界))。不要忘记您需要在Java字符串中转义反斜杠。

但是,我会以不同的方式构建正则表达式。但是,我不明白你的要求是什么意思。你能提供一些例子来说明这一点吗?

答案 1 :(得分:1)

(\bPOSITIVE\b) 

应该做的伎俩(说我的酷正则表达式调试器)。方括号定义字符类和圆括号模式(不要忘记在java字符串文字中加倍\)

答案 2 :(得分:1)

  1. 您需要双重转义,因此\b应该成为\\b

  2. 不要将“POSITIVE”放入方括号中,这会创建一个字符类,意味着匹配任何包含的字符。

    [POSITIVE\b]+替换为POSITIVE\b

  3. 当我正确理解您的要求时,您应该只需要(?i)\\bpositive\\b

    (?i)使您的inputStr.toUpperCase()不必要,因为它会使匹配案例独立。 \\b是一个单词边界意味着如果之前没有单词字符,并且单词“positive”后面没有单词字符,则为真。

    测试代码

    String s1 = "ssdf Positiveasd asd sdfewrewr asd";
    String s2 = "ssdf Positive asd asd sdfewrewr asd";
    String s3 = "ssdf poSiTive asd sdfewrewr asd";
    String s4 = "ssdf FooPositive asd sdfewrewr asd";
    
    String[] s = { s1, s2, s3, s4 };
    String regex = "(?i)\\bpositive\\b";
    
    for(String a : s) {
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(a);
    
        if (matcher.find())
            System.out.println(a + " ==> Success");
        else
            System.out.println(a + " ==> Failure");
    }
    

    <强>输出

      

    ssdf positiveasd asd sdfewrewr asd ==&gt;故障
      ssdf积极的asd asd sdfewrewr asd ==&gt;成功
      ssdf poSiTive asd sdfewrewr asd ==&gt;成功
      ssdf FooPositive asd sdfewrewr asd ==&gt;失败

答案 3 :(得分:1)

如果我理解你,你想要匹配像

这样的东西
Positive; blah
Positive blah
blah Positive blah

但不是你的示例字符串或

之类的东西
Positive;; blah
;Positive

是吗?如果是这样,我觉得你的表情过于复杂......

这样的事情怎么样?

String patternStr = "[^\\s]+POSITIVE[\\b]?[$\\s]*";
Pattern pattern = Pattern.compile(patternStr, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(inputStr);
boolean matchFound = matcher.find();

另外,您可能希望确保“特殊字符”的定义与\ b字边界的定义相同。

答案 4 :(得分:0)

尝试删除边界\b,并查看它是否返回true。

答案 5 :(得分:0)

执行以下操作可能更简单:

public boolean doesInputContainWord(String inputStr, String word) {
    inputStr = inputStr.toLowerCase().replaceAll("[^a-z]", " ");
    word = " " + word.toLowerCase() + " ";
    return inputStr.contains(word);
}

这将替换输入字符串中不是带空格的字母的每个字符,然后检查转换文本是否包含word。请注意,这是<space> + <word> + <space>

或者,如果您真的想使用正则表达式进行匹配,那么我建议删除“{1}}周围的”{1}},以及[]\b之后。括号是定义一个字符类,在这种情况下不是你想要的。您想要查找文字文本“POSITIVE”。 +将匹配“OOST”和“VIVE”之类的内容以及包含“Positive”一词中的一个或多个字母的任何字符串。

答案 6 :(得分:-1)

您也可以使用

if(inputStr.indexOf("Positive") > 0){
   //Word is found
}