Java正则表达式-试图从以某个字符串开头的行中分离文本?
编辑:确保在尝试使用组之前调用Matcher#matches或Matcher#find强>Java正则表达式-试图从以某个字符串开头的行中分离文本?,java,android,regex,Java,Android,Regex,编辑:确保在尝试使用组之前调用Matcher#matches或Matcher#find 我试着做一些非常简单的事情——我试着从以单词开头的一行中获取文本。在这种情况下,单词是位置:。我阅读的是原始HTML,因此感兴趣的行实际上如下所示: Location: Main Hall 8/28/2014 Alumni Reunion Location: Main Hall <span class="extra-info">
我试着做一些非常简单的事情——我试着从以单词开头的一行中获取文本。在这种情况下,单词是
位置:
。我阅读的是原始HTML,因此感兴趣的行实际上如下所示:
Location: Main Hall
8/28/2014
Alumni Reunion
Location: Main Hall
<span class="extra-info">
Blah blah blah....
</span>
显然,我想把Main Hall
还给我,这样我就可以看到我申请的位置了
这就是我尝试过的:
String t_location = "";
Pattern t_pat = Pattern.compile("^[\\s]+?(?s)Location: (?-s)(.*)$");
Matcher t_match = t_pat.matcher(t_inner_html);
t_location = t_match.group(0);
但我一直在犯错误:
java.lang.IllegalStateException:到目前为止没有成功匹配
分解我的正则表达式,这就是(我认为)我正在做的:
^
-从行首开始读取
[\\s]+?
-使用不情愿的限定符,读取行首的空格,直到找到其他内容
(?s)位置:(?-s)
-读取文本字符串“位置:”
(.*)$
-读取字符(新行除外),直到行尾
这就是我所想的。我对正则表达式不太在行,但我一直试图按照文档进行操作,但没有效果。有人能帮我吗
例如,字符串
t_internal_html
如下所示:
Location: Main Hall
8/28/2014
Alumni Reunion
Location: Main Hall
<span class="extra-info">
Blah blah blah....
</span>
8/28/2014
校友重聚
地点:大会堂
胡说八道。。。。
首先使用String indexOf方法查找行是否包含“Location:”。
然后使用str.replace(“位置:”,“”);在具有“位置:”的行上
这会让你得到你想要的
见演示
如果这不是Java,这个正则表达式应该可以工作,这取决于您的行尾(EOL)字符序列:
(.|\n)*Location:\s*(.*)\n
所需字符串位于组索引1
处
现在,由于这个正则表达式将位于Java字符串中,而且反斜杠是Java字符串中的转义字符,因此您实际上必须用双反斜杠污染纯正则表达式:
Pattern t_pat = Pattern.compile("(.|\\n)*Location:\\s*(.*)\\n");
一般来说,为了测试正则表达式,我非常喜欢这个工具:
这是一个交互式测试程序,当它与正则表达式匹配时,它将逐步突出显示您的示例输入。编辑正则表达式或更改示例输入时,匹配的突出显示将实时更新。这不支持Java所需的双反斜杠,因此在工具中使用单反斜杠进行测试,将它们粘贴到Java,然后添加额外的反斜杠
您可能还想使用这个工具,它不是实时的,但支持JavaString
regex:
要分解我所拥有的:
(.|\n)*
-零个或多个字符或EOL序列
位置:
-字符串“位置:”
\s*
-零个或多个空格
(.*)
-一个正则表达式组,由绝对任何内容组成,您将捕获它
\n
-下线顺序
如果您在Windows上,可能需要将\n
替换为\r\n
,但请先尝试\n
,然后查看
这将通过“Main Hall”匹配示例输入中的所有内容,并将忽略(
等)之后的所有内容。“Main Hall”将在匹配组1
中结束 请尝试以下操作:
String t_location = "";
Pattern t_pat = Pattern.compile("^\\s+Location:\\s+(.*)$", Pattern.MULTILINE);
Matcher t_match = t_pat.matcher(t_inner_html);
if (t_match.find()) {
t_location = t_match.group(1);
}
您需要使用表达式^和$来匹配每一行,而不是整个字符串
我觉得这应该行得通,但实际上不行。您输入的文本是“地点:大厅”这一行,还是以“2014年8月28日”开头的整个街区?如果是后者,那么你现在匹配的是多行而不是一行,这是一个有点不同的故事。是的,这是多行,t\u internal\u html
是我要看的。我用前面的(?m)
标志尝试了您的表达式。我必须先调用t\u match.matches()
。\u没错-很抱歉,我更关注正则表达式本身而不是Java API。很高兴它能起作用-感谢您接受答案!这也是一个正确的答案。