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

时间:2018-12-01 11:56:48

标签: java regex regex-lookarounds

我正在努力寻找使用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,六个)]

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

  

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

还尝试删除“ \\ s”(对Pattern.compile("\\s+\\[.?\\]\\s+\\.|\\s+\\(.?\\)\\s+\\.|\\.\\s+")这样的空格使用不同的表示法,并尝试了像Pattern.compile("(?<=[.[*]\\s+])|(?=[.(*)]\\s+)|\\.")这样的前行,但都没有帮助:|

2 个答案:

答案 0 :(得分:2)

这可能有点棘手。着眼于下一个小组开始时所需小组的共同特征-有一个字母\w,因此可以用来检测新小组。

利用此优势将其替换为self和之前的\n,因此\n$1和每个组将出现在新行中,这很容易提取。所需的正则表达式(请参见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

答案 1 :(得分:1)

如果每个子字符串的开头或结尾的空格都可以接受,并且使用split,则一种可能性是使用带有正向后缀的交替形式来检查您的不同要求。

在Java中,您必须确定后面的最大和最小长度,因此,例如,可能需要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次的量词之间进行匹配
    • |
    • \. (?!\([^)]+\))一个空格,一个点和一个空格(如果后面没有括号的话)
  • )往后看积极

Java demo