Java中用于匹配字符串开头和结尾的正则表达式

6

我想在Java中使用正则表达式提取特定的字符串。我目前有以下模式:

pattern = "^\\a.+\\sed$\n";

需要匹配以"a"开头且以"sed"结尾的字符串,但这不起作用。我错过了什么吗?

将模式末尾的"\n"删除并替换为"$":仍然无法匹配。从我的角度来看,正则表达式是合法的。

我想要提取的是临时字符串中的"a sed"。

String temp = "afsgdhgd gfgshfdgadh a sed afdsgdhgdsfgdfagdfhh";
                pattern = "(?s)^a.*sed$";
                       pr = Pattern.compile(pattern);

                math = pr.matcher(temp);

“a sed” 是你正在寻找的准确内容吗? - nafas
2个回答

3

更新

您想匹配a sed,如果在ased之间只有空格,则可以使用a\\s+sed

String s = "afsgdhgd gfgshfdgadh a sed afdsgdhgdsfgdfagdfhh";
Pattern pattern = Pattern.compile("a\\s+sed");
Matcher matcher = pattern.matcher(s);
while (matcher.find()){
    System.out.println(matcher.group(0)); 
} 

查看IDEONE演示

现在,如果在ased之间可以有任何内容,使用温和的贪婪令牌:

Pattern pattern = Pattern.compile("(?s)a(?:(?!a|sed).)*sed");
                                         ^^^^^^^^^^^^^  

请参见另一个IDEONE演示

原始回答

你的正则表达式的主要问题在于末尾的\n$是字符串的结尾,您尝试在字符串结束后匹配多一个字符,这是不可能的。此外,\\s匹配空格符,但您需要字面上的s

您需要删除\\\n,使.匹配换行符,并且建议使用*量词以允许0个符号之间的匹配:

pattern = "(?s)^a.*sed$";

查看正则表达式演示

该正则表达式匹配:

  • ^ - 字符串开头
  • a - 字符 a
  • .* - 0 或多个任意字符(因为 (?s) 修饰符使得 . 可以匹配包括换行符在内的任何字符)
  • sed - 字符序列 sed
  • $ - 字符串结尾

请检查我的更新。我认为其中一个解决方案应该适合你。 - Wiktor Stribiżew
如果有制表符或只有空格,这个会起作用吗?谢谢!是否存在一般的正则表达式来匹配“字符开头”和“字符结尾”? - Sandeep Shah
我不知道你指的解决方案是什么。\s匹配任何空白字符,包括制表符、空格和换行符。字符的开头和结尾?不,这样的东西不存在,但我猜你在谈论\\b,一个单词边界:\\bsed\\b将匹配a sed tool中的sed,但不会匹配seduce中的sed。至于温和贪婪标记的解决方案,.将匹配任何字符(包括换行符号),因为我使用了(?s) DOTALL修饰符。 - Wiktor Stribiżew

1
你的temp字符串无法匹配模式(?s)^a.*sed$,因为这个模式表示你的temp字符串必须以字符a开头,并以序列sed结尾,但事实并非如此。你的字符串在“sed”序列后还有尾随字符。 如果你只想提取整个字符串中的那个a...sed部分,尝试使用未锚定的模式“a.*sed”,并使用Matcher类find()方法:
Pattern pattern = Pattern.compile("a.*sed");
Matcher m = pattern.matcher(temp);
if (m.find())
{
    System.out.println("Found string "+m.group());
    System.out.println("From "+m.start()+" to "+m.end());
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接