繁体   English   中英

用Java编写正则表达式

[英]Composing an regular expression in java

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

条件是:

  1. 如果段落中存在特定单词,我想返回true / false。
  2. 这个词可以在任何地方(开头,中间或结尾)
  3. 它应该只返回整个单词,但有例外。 该词只能(或)后跟一个特殊字符,例如..;()[] {}等
  4. 这也是不区分大小写的搜索。

在下面的代码中,我正在搜索正词。 我已经在正则表达式中对字符串进行了硬编码。 理想情况下,在这种情况下,输出应为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);  

您的问题之一是\\b表示“退格字符”(显然,您要匹配的字符串中不存在该字符)。

您需要\\\\b (在完成字符串处理后,regex引擎将其接收为\\b (单词边界))。 不要忘记,您需要在Java字符串中转义反斜杠。

但是,我会以不同的方式构造正则表达式。 但是,我不明白您的要求不是什么意思。 3.您能否提供一些示例来说明这一点?

(\bPOSITIVE\b) 

应该可以解决问题(我很酷的正则表达式调试器说)。 方括号定义字符类,圆括号定义模式(不要忘记在Java字符串文字中加倍\\)

  1. 您需要两次转义,因此\\b应该变成\\\\b

  2. 不要将“正”放在方括号中,这会创建一个字符类,表示匹配任何包含的字符。

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

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

(?i)使您的inputStr.toUpperCase() (?i)变得不必要,因为它使区分大小写无关。 \\\\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 ==>失败
ssdf正asd asd sdfewrewr asd ==>成功
ssdf积极性asd sdfewrewr asd ==>成功
ssdf FooPositive asd sdfewrewr asd ==>失败

如果我了解您,您想匹配以下内容

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字边界的含义相同。

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

进行以下操作可能会更简单:

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

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

或者,如果您真的想使用正则表达式进行匹配,则建议删除“正”周围的[] ,以及后面的\\b+ 方括号定义了一个字符类,在这种情况下,这不是您想要的。 您要查找文字文本“ POSITIVE”。 [POSITIVE]+可以匹配“ OOST”和“ VIVE”之类的东西,几乎可以匹配包含一个或多个单词“ Positive”的字母的字符串。

您也可以使用

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM