使用Java的文本块/多行字符串的正则表达式

321 阅读1分钟

一个Java regex模式 "java或duke "在一个Java字符串上匹配:


import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;

import java.util.regex.Pattern;

import org.junit.jupiter.api.Test;

public class RegexTest {

    @Test
    public void singleLine(){
        var pattern = Pattern.compile(".*(java|duke).*");
        var text = "java duke";
        assertTrue(pattern.matcher(text).matches());
        
    }
    

...但在多行Java字符串/文本块上失败:


@Test
public void multiLine() {
    var pattern = Pattern.compile(".*(java|duke).*");
    var message = """
        java
        duke
    """;
    assertFalse(pattern.matcher(message).matches());
}

选项 [Pattern.DOTALL](https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#DOTALL)

(...) 在dotall模式下,表达式.匹配任何字符,包括行结束符。默认情况下,该表达式不匹配行结束符(...)。

使正则表达式适用于多行字符串:


@Test
public void multiLineDotAll() {
    var pattern = Pattern.compile(".*(java|duke).*",Pattern.DOTALL);
    var message = """
        java
        duke
    """;
    assertTrue(pattern.matcher(message).matches());
}