正则表达式和逃脱和未转义的分隔符

lst*_*kov 7 java regex escaping backslash

有关的问题

我有一个字符串

a\;b\\;c;d
Run Code Online (Sandbox Code Playgroud)

在Java中看起来像

String s = "a\\;b\\\\;c;d"
Run Code Online (Sandbox Code Playgroud)

我需要用分号按照以下规则拆分它:

  1. 如果分号前面有反斜杠,则不应将其视为分隔符(在ab之间).

  2. 如果反斜杠本身被转义,因此不会以分号方式转义,那么分号应该是分隔符(在bc之间).

因此,如果在它之前存在零或偶数个反斜杠,则应将分号视为分隔符.

例如上面,我想得到以下字符串(java编译器的双反斜杠):

a\;b\\
c
d
Run Code Online (Sandbox Code Playgroud)

Tim*_*ker 6

你可以使用正则表达式

(?:\\.|[^;\\]++)*
Run Code Online (Sandbox Code Playgroud)

匹配未转义分号之间的所有文本:

List<String> matchList = new ArrayList<String>();
try {
    Pattern regex = Pattern.compile("(?:\\\\.|[^;\\\\]++)*");
    Matcher regexMatcher = regex.matcher(subjectString);
    while (regexMatcher.find()) {
        matchList.add(regexMatcher.group());
    } 
Run Code Online (Sandbox Code Playgroud)

说明:

(?:        # Match either...
 \\.       # any escaped character
|          # or...
 [^;\\]++  # any character(s) except semicolon or backslash; possessive match
)*         # Repeat any number of times.
Run Code Online (Sandbox Code Playgroud)

++由于嵌套量词,占有性匹配()对于避免灾难性回溯非常重要.