如何匹配包含行终止符的任意符号?正则匹配问题咨询
如何匹配包含行终止符的任意字符
首先得指出你代码里的一个关键问题:你写的([.]{1,})模式根本不是匹配任意字符——在正则的**字符类(方括号[])**里,.是字面量的点,不是通配符!所以这个模式只会匹配一个或多个连续的.,自然匹配不了"text abc"这种没有点的文本。
接下来针对你的需求(匹配包括换行在内的任意字符),给你两种靠谱的解决方案:
方案1:使用DOTALL模式(推荐)
Java的Pattern.DOTALL标记(或者内联的(?s))会让正则中的.元字符匹配包括换行符\n在内的所有字符,这样你原来的(.+) abc模式就能处理带换行的文本了。
代码示例:
// 假设文本包含换行 String text = "line1\nline2 abc"; // 方式1:使用Pattern.DOTALL常量 Pattern pattern = Pattern.compile("(.+) abc", Pattern.DOTALL); // 方式2:使用内联标记(?s),更简洁 // Pattern pattern = Pattern.compile("(?s)(.+) abc"); Matcher m = pattern.matcher(text); while (m.find()) { System.out.println(m.group(1)); // 会输出"line1\nline2" }
方案2:用字符类匹配任意字符(包括换行)
如果你不想依赖DOTALL标记,可以用覆盖所有字符范围的字符类,比如[\s\S](匹配所有空白+非空白字符,也就是所有字符)、[\d\D](数字+非数字)或者[\w\W](单词字符+非单词字符),这些组合都能匹配包括换行在内的任意字符。
比如替换你想要的[.\n]写法,改成:
String text = "line1\nline2 abc"; // 注意Java字符串里反斜杠要转义成\\ Pattern pattern = Pattern.compile("([\\s\\S]+) abc"); Matcher m = pattern.matcher(text); while (m.find()) { System.out.println(m.group(1)); }
为什么你的[.\n]不行?
再次强调:字符类里的.是普通字符,所以[.\n]只能匹配点或者换行符,不能匹配其他字符(比如字母、数字),这显然不符合你“匹配任意字符”的需求。
内容的提问来源于stack exchange,提问作者Mikhail Ionkin
相关产品推荐
相关产品推荐

