我正在尝试编写一个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.*"