如果我理解正确的话你
- 想要在关键字
FIRST NOW THEN 上分隔文本并将它们保留在结果部分中
- 但如果这些关键字出现在引号内,则不想拆分它们。
如果我的猜测是正确的而不是split 方法,你可以使用find 来遍历所有
这将允许您将所有引号和空格添加到结果中,并且只专注于检查不在引号内的单词,看看您是否应该拆分它们。
表示此类部分的正则表达式可能类似于Pattern.compile("\"[^\"]*\"|\\S+|\\s+");
重要提示:我们需要先搜索“..”,否则 \\S+ 也会匹配 "NOW CLICK" 作为 "NOW 和 CLICK" 作为两个单独的部分,这将防止它被视为单引号。这就是为什么我们要将"[^"]*" 正则表达式(代表引号)放在subregex1|subregex2|subregex3 系列的开头。
这个正则表达式将允许我们迭代文本
FIRST i go to the homepage NOW i click on button "NOW CLICK" very quick THEN i will become a text result.
作为令牌
FIRST
i
go
to
the
homepage
NOW
i
click
on
button
"NOW CLICK"
very
quick
THEN
i
will
become
a
text
result.
THEN
i
will
become
a
text
result.
注意"NOW CLICK" 将被视为单个令牌。因此,即使它 contain 在您要拆分的关键字内,它也永远不会 等于 这样的关键字(因为它将包含其他字符,例如 " ,或者只是引用中的其他词)。这将防止它被视为应该分割文本的 分隔符。
使用这个想法,我们可以创建如下代码:
String text = "FIRST i go to the homepage NOW i click on button \"NOW CLICK\" very quick THEN i will become a text result.";
List<String> keywordsToSplitOn = List.of("FIRST", "NOW", "THEN");
//lets search for quotes ".." | words | whitespaces
Pattern p = Pattern.compile("\"[^\"]*\"|\\S+|\\s+");
Matcher m = p.matcher(text);
StringBuilder sb = new StringBuilder();
List<String> result = new ArrayList<>();
while(m.find()){
String token = m.group();
if (keywordsToSplitOn.contains(token) && sb.length() != 0){
result.add(sb.toString());
sb.delete(0, sb.length());//clear sb
}
sb.append(token);
}
if (sb.length() != 0){//include rest of text after last keyword
result.add(sb.toString());
}
result.forEach(System.out::println);
输出:
FIRST i go to the homepage
NOW i click on button "NOW CLICK" very quick
THEN i will become a text result.