【问题标题】:Java string - get everything between (but not including) two regular expressions?Java字符串 - 获取(但不包括)两个正则表达式之间的所有内容?
【发布时间】:2009-06-07 15:41:03
【问题描述】:

在 Java 中,是否有一种简单的方法来提取子字符串,方法是在任一侧指定正则表达式分隔符,而不在最终子字符串中包含分隔符?

例如,如果我有这样的字符串:

<row><column>Header text</column></row>

提取子字符串最简单的方法是什么:

Header text

请注意子字符串可能包含换行符...

谢谢!

【问题讨论】:

    标签: java regex string split


    【解决方案1】:

    像这样写一个正则表达式:

    "(regex1)(.*)(regex2)"
    

    ...并从匹配器中拉出中间组(以处理要使用Pattern.DOTALL 的模式中的换行符)。

    使用您的示例,我们可以编写如下程序:

    package test;
    
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class Regex {
    
        public static void main(String[] args) {
            Pattern p = Pattern.compile(
                    "<row><column>(.*)</column></row>",
                    Pattern.DOTALL
                );
    
            Matcher matcher = p.matcher(
                    "<row><column>Header\n\n\ntext</column></row>"
                );
    
            if(matcher.matches()){
                System.out.println(matcher.group(1));
            }
        }
    
    }
    

    运行时打印出来的内容:

    Header
    
    
    text
    

    【讨论】:

    • @Adam ...这只是因为我需要启动 Eclipse 来获取示例并希望快速得到答案;)
    • @Aaron:很公平。那么我不妨删除我的第一条评论:)很好的答案。
    • @Aaron - 谢谢,你的例子有效!但是请你告诉我用什么正则表达式模式从这样的字符串中提取相同的文本,其中包括一些单引号? Header\n\n\ntext 我试过使用 Pattern p = Pattern.compile(" (.*)", Pattern.DOTALL );和相同的,但在引号前面有反斜杠,但都不起作用。对不起,我对正则表达式很陌生,感谢您的帮助。再次感谢你!安娜
    • Anna,这就是为什么使用合适的工具来解析 XML 会更容易:XML 解析器。 XML 不是正则语言,所以不要试图用正则表达式来解析它。
    • 在这里唤醒死者.. 只是一个快速提示:您可能想使用matcher.find() 而不是matches(),以防您正在搜索的字符串大于您正在搜索的位有兴趣。
    【解决方案2】:

    您不应该使用正则表达式来解码 XML - 如果输入不受严格控制,这最终会中断。

    最简单的方法可能是在 DOM 树中解析 XML(Java 1.4 及更新版本直接包含 XML 解析器),然后导航树以挑选出您需要的内容。

    也许你想告诉你想用你的程序完成什么?

    【讨论】:

    • +1 一旦你有了一个 DOM 树,你就可以使用 XPath 提取你想要的位。
    猜你喜欢
    • 2020-09-27
    • 2019-06-20
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    相关资源
    最近更新 更多