Java正则如何匹配包含换行的任意非空完整字符串?
Java 正则替代PHP
\X 匹配多行字符串方案 核心需求说明
PHP正则中的\X标记可匹配包含换行在内的所有字符,实现任意非空多行字符串的完整匹配,但Java原生不支持\X标记,可通过以下方案实现同等效果。
你给出的待匹配示例字符串如下:
This is a multi-line string with some charakters like $ and / and ´ to match fully.
方案1:匹配完整非空多行字符串
该方案可将整段多行字符串作为1个结果匹配,符合你给出的示例要求。
Java正则的元字符.默认不匹配换行符,只需开启DOTALL(也称s修饰符)模式即可让.匹配包括换行在内的所有字符,结合+限定非空即可:
- 写法1:正则内嵌入修饰符,写法为
(?s).+ - 写法2:编译正则时显式指定
Pattern.DOTALL参数,正则写为.+
代码示例:
import java.util.regex.Matcher; import java.util.regex.Pattern; public class MultiLineMatchTest { public static void main(String[] args) { String targetStr = "This is a \n" + "multi-line\n" + "string with some charakters like $ and / and ´\n" + "to match fully."; // 嵌入修饰符写法 Matcher matcher1 = Pattern.compile("(?s).+").matcher(targetStr); if (matcher1.find()) { // 输出完整的多行字符串,仅1个匹配结果 System.out.println("匹配结果:\n" + matcher1.group()); } // 显式指定DOTALL参数写法 Matcher matcher2 = Pattern.compile(".+", Pattern.DOTALL).matcher(targetStr); if (matcher2.find()) { System.out.println("匹配结果:\n" + matcher2.group()); } } }
方案2:等价\X语义匹配单个Unicode字素簇
如果你需要的是和\X原始语义完全一致的单个Unicode字素簇匹配(比如带音调的特殊字符整体匹配),可使用正则\P{M}\p{M}*+实现:
\P{M}匹配任意非标记类Unicode字符\p{M}*+匹配0个或多个标记类Unicode字符,使用占有量词避免回溯
如果要匹配整段非空的字素簇序列,可写为(?:\P{M}\p{M}*+)+,开启DOTALL模式也可兼容换行。
内容的提问来源于stack exchange,提问作者Harper
相关产品推荐
相关产品推荐

