在最近的一次使用中String.split()
,我遇到了这样一种情况,即文本是如此动态,选择匹配项比过滤掉不匹配项更容易。
我发现自己想知道是否可以修改“反向正则表达式”,String.split()
以便您可以给它任何模式,它会匹配与该模式不匹配的每一组字符。
*注意:这里的“问题”可以用String.matches()
, Tokens
,Matcher.group()
等轻松解决。这个问题主要是假设性的(仍然欢迎代码示例,因为问题的性质非常需要它),而不是关于如何获得结果,而是关于是否有可能以这种方式实现它们。
我尝试了什么:
String pattern1 = "(test)"; //A verif. that what "should-not-match" is working correctly.
String pattern2 = "[^(test)]"; //FAIL - unmatches the letters separately.
String pattern3 = "(^(test))"; //FAIL - does not match anything, it seems.
String text = ""
+ "This is a test. "
+ "This test should (?not?) match the word \"test\", whenever it appears.\n"
+ "This is about to test if a \"String.split()\" can be used in a different way.\n"
+ "By the way, \"testing\" does not equal \"test\","
+ "but it will split in the middle because it contains \"test\".";
for (String s : text.split(pattern3)) {
System.out.println(s);
}
以及其他类似的模式,但都没有成功。
更新:
我现在也尝试了一些使用特殊构造函数的模式,但也没有让它工作。
至于我想要什么,按照“测试”示例,是获取一个包含内容为“文本”的字符串的数组(我想用作基本模式,或者换句话说,我想要查找的内容)。
但是这样做使用String.split()
, with 使得使用基本模式直接导致“任何不是(测试)”,因此需要反转以导致“只是(测试)的出现”。
Bible-sized-long-story-short,想要的是String.split()
导致这种行为的正则表达式(+结果):注意:遵循上面的示例代码,包括所需的变量(文本)。
String[] trash = text.split("test"); //<-base pattern, needs reversing.
System.out.println("\n\nWhat should match the split-pattern (due reversal), become separators, and be filtered out:");
for (String s : trash) {
System.out.println("[" + s + "]");
text = text.replace(s, "%!%"); //<-simulated wanted behavior.
}
System.out.println("\n\nWhat should be the resulting String[]:");
for (String s : text.split("%!%")) {
System.out.println(s);
}
System.out.println("Note: There is a blank @ index [0], since if the text does not start with \"test\", there is a sep. between. This is NOT WRONG.");
欢迎使用代码示例。毕竟,创建此类代码的可能性(或不可能性)是这个问题的本质。