如何通过不带转义点和忽略双黑斜杠来拆分?

jyztefdp  于 2021-07-07  发布在  Java
关注(0)|答案(2)|浏览(271)

我需要按点分割数据。我已经逃脱了点(.),我应该忽略。我也应该忽略转义反斜杠(\)。例如,

data1\\.d\\\\\.ata2\\\\.da\.ta3.data4

对于子字符串,应该将此字符串拆分为

data1\\
d\\\\\.ata2\\\\
da\.ta3
data4

我无法为此创建正则表达式。你知道吗,有可能吗?我试着使用以下方法:

(?<!\\((\\\\){2,}))\\. - not working

如果转义斜杠只定义一次,我可以创建以下正则表达式:

"((?<!\\\\)\\.)|((?=([^\\\\]*((\\\\\\\\)+[^\\\\]*)))\\.)";

例如 data1\\.d\.ata2.da\.ta3.data4 正确拆分:

data1\\
d\.ata2
da\.ta3
data4

但我无法检测反斜杠定义甚至多次。你能帮帮我吗?谢谢您!

svmlkihl

svmlkihl1#

可以使用

(?s)(?:[^\\.]|\\.)+

查看regex演示。细节: (?s) -启用 Pattern.DOTALL 标记以便 . 可以跨行匹配 (?:[^\\.]|\\.)+ -一次或多次出现除 \ 以及 . ,或 \ 后面跟着任何字符。
查看java演示:

String line = "data1\\\\.d\\.ata2.da\\.ta3.data4";
Pattern p = Pattern.compile("(?s)(?:[^\\\\.]|\\\\.)+");
Matcher m = p.matcher(line);
List<String> res = new ArrayList<>();
while(m.find()) {
    res.add(m.group());
}
System.out.println(res);
// => [data1\\, d\.ata2, da\.ta3, data4]
xpszyzbs

xpszyzbs2#

您可以使用此正则表达式获取匹配项:

(?=[^.])[^.\\]*(?:\\.[^.\\]*)*(?=\.|$)

正则表达式演示
正则表达式演示: (?=[^.]) :确保前面有非点字符 [^.\\]* :匹配任何非字符的0+ . 不是一个
\ (?:\\.[^.\\]*)* :一个非捕获组,它匹配反斜杠,后跟转义字符,并且应该后跟0个或多个非转义字符 . 不是一个 \ . 匹配此组中的0个或多个 (?=\.|$) :确保前面有一个点或行尾

相关问题