我正在努力寻找使用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+)|\\.")
这样的前行,但都没有帮助:|
答案 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中,代码将使用方法replaceAll
和split
(感谢@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次的量词之间进行匹配|
或\. (?!\([^)]+\))
一个空格,一个点和一个空格(如果后面没有括号的话))
往后看积极