2016-04-21 59 views
1

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

任何想法如何让这场比赛在字符串中的任何单词?

由于提前,

克雷格

+1

'\ bWORD \ b'作为'\ b'是“文字边界”锚点。相关阅读:http://www.regular-expressions.info/wordboundaries.html – CollinD

+0

为什么你不只是使用'String.contains(String)'? – showp1984

+0

即时通讯不使用包含,因为我不想找到其他人的话(即如果我寻找烧伤,烧伤将是真的) 我试图把\ b,但它似乎并没有工作。 – craigtb

回答

0

的问题是你的性格课前和词[^a-z]后 - 我认为你真正想要的是一个单词边界字符\b(按ColinD的评论)作为反对不在az范围内的角色。正如评论中所指出的(谢谢),您还需要处理字符串个案的开始和结束。

因此,尝试,如:

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

'\ W'不能匹配'^'和'$'吗?还是我误会了? – CollinD

+1

@CollinD对该问题的评论是正确的。这个答案是行不通的,因为字符类“[]”完全匹配一个字符。起初,没有前面的字符。 – sapanoia

+1

'\ B'实际上是非字边界锚。 '\ b'是用于单词边界的。 – CollinD

0

您可以使用可选的,检查下面的链接和测试更多的情况下,如果此给予适当的输出(?): https://regex101.com/r/oP5zB8/1

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

这里,'。* [^ a-z]?'是一样好'。*'。 – sapanoia

0

我觉得(^|^.*[^a-z])trying([^a-z].*$|$)恰好符合你的需求。

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

0

你可以试试下面的程序来检查任何字符串的开始和结束的存在:

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); 
    } 
} 
0

你应该使用的指定开头或一个词来代替[^ AZ的结局边界\ b ]这不是那么逻辑。 就像

".*\\bfind\\b.*" 
相关问题