Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java正则表达式-试图从以某个字符串开头的行中分离文本?_Java_Android_Regex - Fatal编程技术网

Java正则表达式-试图从以某个字符串开头的行中分离文本?

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">

编辑:确保在尝试使用组之前调用Matcher#matches或Matcher#find


我试着做一些非常简单的事情——我试着从以单词开头的一行中获取文本。在这种情况下,单词是
位置:
。我阅读的是原始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,然后添加额外的反斜杠

您可能还想使用这个工具,它不是实时的,但支持Java
String
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。很高兴它能起作用-感谢您接受答案!这也是一个正确的答案。