【问题标题】:Java Regex - Trying to isolate text from a line that starts with a certain string?Java Regex - 试图从以某个字符串开头的行中分离出文本?
【发布时间】:2014-08-28 04:17:31
【问题描述】:

编辑:请确保在尝试使用组之前致电 Matcher#matches 或 Matcher#find! Source


我正在尝试做一些非常简单的事情 - 我正在尝试从以单词开头的行中获取文本。在这种情况下,单词是Location:。我正在阅读原始 HTML,因此感兴趣的行实际上如下所示:

      Location: Main Hall

显然,我希望将 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: No successful match so far

分解我的正则表达式,这就是(我认为)我正在做的事情:

^ - 从行首读取

[\\s]+? - 使用不情愿的限定符,读取行首的空格,直到我们遇到其他问题

(?s)Location: (?-s) - 已读取文字字符串“Location:”

(.*)$ - 读取字符(换行符除外)直到行尾

这就是我认为我正在做的事情。我不太擅长正则表达式,但我试图按照文档无济于事。有人可以帮帮我吗?


例如,字符串t_inner_html 如下所示:

8/28/2014
      Alumni Reunion
      Location: Main Hall

      <span class="extra-info">
           Blah blah blah....
      </span>

【问题讨论】:

    标签: java android regex


    【解决方案1】:

    如果这不是 Java,则此正则表达式应该可以工作,具体取决于您的行尾 (EOL) 字符序列是什么:

    (.|\n)*Location:\s*(.*)\n
    

    您想要的字符串位于组索引1

    现在,由于这个正则表达式将在 Java String 中,并且由于反斜杠是 Java 字符串中的转义字符,因此您实际上必须用双反斜杠污染纯正则表达式:

    Pattern t_pat = Pattern.compile("(.|\\n)*Location:\\s*(.*)\\n");
    

    总的来说,为了测试正则表达式,我真的很喜欢这个工具:

    http://regexpal.com/

    这是一个交互式测试器,会在您的示例输入与正则表达式匹配时逐步突出显示它。当您编辑正则表达式或更改示例输入时,匹配的突出显示将实时更新。这不支持 Java 所需的双反斜杠,因此在工具中使用单反斜杠进行测试,将它们粘贴到 Java,然后添加额外的反斜杠。

    您可能还想尝试一下这个工具,它不是实时的,但确实支持 Java String 正则表达式:

    http://www.regexplanet.com/advanced/java/index.html

    分解我所拥有的:

    (.|\n)* - 零个或多个字符或 EOL 序列

    Location: - 字符串“位置:”

    \s* - 零个或多个空格

    (.*) - 一个正则表达式组,绝对由任何内容组成,这就是您将捕获的内容

    \n - EOL 序列

    如果您在 Windows 上,您可能需要将 \n 替换为 \r\n,但请先尝试 \n 看看。

    这将匹配您通过“主厅”输入的样本中的所有内容,并且将忽略(&lt;span . . .&gt; 等)之后的所有内容。“主厅”将最终进入匹配组1

    【讨论】:

    • 我觉得这应该可行,但它没有。
    • 您的输入文本是“位置:主厅”这一行,还是以“2014 年 8 月 28 日”开头的整个区块?如果是后者,那么您现在匹配的是多行而不是单行,这是一个不同的故事。
    • 是的,它是多行,t_inner_html 是我正在查看的内容。我在前面加上(?m) 标志尝试了你的表达。
    • 我必须先打电话给t_match.matches() ._.
    • 没错 - 抱歉,我更关注正则表达式本身而不是 Java API。很高兴它正在工作 - 感谢您接受答案!
    【解决方案2】:

    请尝试以下方法:

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

    您需要对表达式 ^ 和 $ 使用 Pattern.MULTILINE 来匹配每一行而不是整个字符串。


    Java Fiddle Demo

    【讨论】:

    • 这也是一个有效的答案。
    【解决方案3】:

    首先使用 String indexOf 方法查找行是否包含“Location :”。 然后使用 str.replace("Location : ","");在具有“位置:”的行上。

    【讨论】:

      【解决方案4】:
       .*?Location:(.*?)\n
      

      这应该可以得到你想要的。

      查看演示。

      http://regex101.com/r/rJ1oQ3/1

      【讨论】:

        猜你喜欢
        • 2019-12-21
        • 2014-12-02
        • 2022-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多