繁体   English   中英

使用多个字符分隔符拆分正则表达式

[英]Split regex with multi char delimiters

我正在努力寻找使用Java中多个字符的分隔符来分割字符串的正确方法(例如'。[1a]'或'。(2b)')

这是一个测试用例:

String str1 = "This is test 1  .  This is test 2  [2 b]. This is test 3 (3). This is test 4.[4a] This is a test 5 . This is test 6 . (6,six)";

Pattern regex = Pattern.compile("\\.\\s{0,}\\[.*\\]\\s{0,}|\\.\\s{0,}\\(.*\\)\\s{0,}|\\.\\s{0}");

System.out.println(Arrays.toString(regex.split(text)));

我的目标输出是以下(每个子字符串的开头或结尾的空格都很好,重要的是保持分隔符):

[这是测试1。 ,这是测试2 [2 b]。 ,这是测试3(3)。 ,这是测试4. [4a],这是一个测试5。 ,这是测试6。 (6,6)]

但是,这是我得到的输出:

[这是测试1,这是测试2 [2 b],这是测试3(3),这是测试4,这是测试5,这是测试6]

还尝试删除“\\\\ s”,这是一个不同的符号,如Pattern.compile("\\\\s+\\\\[.?\\\\]\\\\s+\\\\.|\\\\s+\\\\(.?\\\\)\\\\s+\\\\.|\\\\.\\\\s+")并尝试使用Pattern.compile("(?<=[.[*]\\\\s+])|(?=[.(*)]\\\\s+)|\\\\.")等前瞻Pattern.compile("(?<=[.[*]\\\\s+])|(?=[.(*)]\\\\s+)|\\\\.")但没有帮助:|

这可能有点棘手。 关注所需组在下一个开始时结束的共同特征 - 有一个字母\\w所以用它来检测一个新组。

使用此优势将其替换为self和之前的\\n ,因此\\n$1并且每个组将出现在一个相当容易提取的新行上。 通缉的Regex(参见Regex101 )是:

 (?<!\w )(\w)(?=\w{2,})
  • 记住一个 (空间)在正则表达式的第一个字符!

这会产生一个输出:

This is test 1  . 
This is test 2  [2 b].
This is test 3 (3).
This is test 4.[4a]
This is a test 5 .
This is test 6 . (6,six)

在Java中,代码将使用方法replaceAllsplit (感谢@jmng进行改进):

String str1 = "This is test 1  .  This is test 2  [2 b]. This is test 3 (3). This is test 4.[4a] This is a test 5 . This is test 6 . (6,six)";

Pattern reg1 = Pattern.compile(" (?<!\\w )(\\w)(?=\\w{2,})");              // Preparation
Pattern regNewline = Pattern.compile("\n");                                // Split
String[] array = regNewline.split(reg1.matcher(str1).replaceAll("\n$1"));  // Apply


Arrays.stream(array).forEach(System.out::println);                         // Test it

如果每个子串的开头或末尾的空格是可接受的并且使用拆分的一种可能性,则可以使用具有正向外观检查的交替来满足您的不同要求。

在Java中,您必须确定lookbehind的最小和最大可能长度,因此您可能需要为示例数据取10。

(?<=\\[[^]]{1,10}]\\.|\\.\\[[^]]{1,10}]|\\([^)]{1,10}\\)\\.| \\. (?!\\([^)]+\\)))

在Java中:

(?<=\\\\[[^]]{1,10}]\\\\.|\\\\.\\\\[[^]]{1,10}]|\\\\([^)]{1,10}\\\\)\\\\.| \\\\. (?!\\\\([^)]+\\\\)))

说明

  • (?<=正面观察,检查左边是什么
    • \\[[^]]{1,10}]\\. 使用一个否定的字符类来匹配方括号和一个量词,该量词不是重复括号1 - 10次后跟一个点
    • | 要么
    • \\.\\[[^]]{1,10}]匹配一个点并使用一个否定的字符类来匹配方括号和一个重复不是结束括号的量词1 - 10次
    • | 要么
    • \\([^)]{1,10}\\)\\. 使用否定的字符类来匹配括号和不重复括号1到10次的量词
    • | 要么
    • \\. (?!\\([^)]+\\)) \\. (?!\\([^)]+\\))如果后面的内容不是括号之间的任何内容,则为空格,点和空格
  • )关闭积极的lookbehind

Java演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM