正则表达式与字符串的第一个和最后一个单词不匹配



我正在尝试编写一个java程序,该程序将在字符串中查找特定单词。我让它大部分工作,但如果要匹配的单词是字符串中的第一个或最后一个单词,它似乎不匹配。 下面是一个示例:

"trying to find the first word".matches(".*[^a-z]find[^a-z].*") //returns true
"trying to find the first word".matches(".*[^a-z]trying[^a-z].*") //returns false
"trying to find the first word".matches(".*[^a-z]word[^a-z].*") //returns false

知道如何对字符串中的任何单词进行匹配吗?

提前感谢,

克雷格

问题是单词[^a-z]之前和之后的字符类 - 我认为您真正想要的是一个单词边界字符b(根据 ColinD 的评论),而不是 a-z 范围内的字符。正如评论(谢谢)中指出的,您还需要处理字符串大小写的开头和结尾。

所以尝试,例如:

"(?:^|.*b)trying(?:b.*|$)" 

您可以使用可选的 (?) ,检查下面的链接并测试更多情况,如果这给出了正确的输出:https://regex101.com/r/oP5zB8/1

 (.*[^a-z]?trying[^a-z]?.*)

我认为(^|^.*[^a-z])trying([^a-z].*$|$)正好符合您的需求。

(?:^|^.*[^a-z])trying(?:[^a-z].*$|$)用于非捕获括号。

您可以尝试以下程序来检查任何字符串的开头和结尾是否存在:

package com.ajsodhi.utilities;
import java.util.regex.Pattern;
public class RegExStartEndWordCheck {
    public static final String stringToMatch = "StartingsomeWordsEndWord";
    public static void main(String[] args) {
        String regEx = "Starting[A-Za-z0-9]{0,}EndWord";
        Pattern patternOriginalSign = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);
        boolean OriginalStringMatchesPattern = patternOriginalSign.matcher(stringToMatch).matches();
        System.out.println(OriginalStringMatchesPattern);
    }
}

你应该使用边界\b来指定单词的开头或结尾,而不是[^a-z],这不是那么合乎逻辑。只是像

".*\bfind\b.*" 

最新更新