我想在Java中使用Regex提取类似的字符串。我目前有这种模式:
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);
答案 0 :(得分:3)
<强>更新强>
您希望与a sed
匹配,因此如果a\\s+sed
和a
之间只有空格,则可以使用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 demo
现在,如果在a
和sed
之间可以有任何,请使用驯服的贪婪令牌:
Pattern pattern = Pattern.compile("(?s)a(?:(?!a|sed).)*sed");
^^^^^^^^^^^^^
原始回答
正则表达式的主要问题是最后的\n
。 $
是字符串的结尾,并且您尝试在字符串结束后再匹配一个字符,这是不可能的。此外,\\s
与空白符号匹配,但您需要文字s
。
您需要移除\\
和\n
并使.
与换行符匹配,并且建议使用*
量词来允许介于0之间的0个符号:
pattern = "(?s)^a.*sed$";
<强> See the regex demo 强>
正则表达式匹配:
^
- 字符串开头a
- 文字a
.*
- 0个或更多任何字符(因为(?s)
修饰符使.
匹配包含换行符的任何字符)sed
- 字母序列sed
$
- 字符串结尾答案 1 :(得分:1)
您的temp
字符串与模式(?s)^a.*sed$
不匹配,因为此模式表明您的temp
字符串必须以字符 a <开始 strong>和结束序列 sed ,但事实并非如此。在&#34; sed&#34;之后,你的字符串有尾随字符。序列。
如果您只想提取整个字符串的 a ... sed 部分,请尝试使用unanchored模式&#34; a。* sed&#34;并使用find()
的{{1}}方法:
Matcher class