我如何使用 split-cretiria 拆分下面的文本:首先,现在,然后:
String text = "FIRST i go to the homepage NOW i click on button \"NOW CLICK\" very quick THEN i will become a text result.";
预期是三个句子:
- 首先我去主页
- 现在我很快点击按钮“NOW CLICK”
- 然后我将成为一个文本结果。
此代码不起作用,因为按钮“现在单击”
String[] textArray = text.split("FIRST|NOW|THEN");
最佳答案
如果我没理解错你
- 想要根据关键字
FIRST
NOW
THEN
分隔文本并将它们保留在结果部分 - 但如果这些关键字出现在引号内,则不想拆分它们。
如果我的猜测是正确的而不是 split
方法,您可以使用 find
遍历所有
- 引述
- 不在引号内的单词,
- 空格。
这将使您可以将所有引号和空格添加到结果中,并只专注于检查不在引号内的单词,看看您是否应该拆分它们。
表示这些部分的正则表达式可以类似于 Pattern.compile("\"[^\"]*\"|\\S+|\\s+");
重要:我们需要先搜索“..”,否则 \\S+
也会匹配 "NOW CLICK "
作为 "NOW
和 CLICK"
作为两个独立的部分,这将防止它被视为单引号。这就是为什么我们要在 subregex1|subregex2|subregex3
系列的开头放置 "[^"]*"
正则表达式(代表引号)。
这个正则表达式将允许我们遍历文本
首先我转到主页现在我很快点击按钮“NOW CLICK”然后我将变成一个文本结果。
作为代币
第一个
我
开始
到
首页
现在
我
点击
开启
按钮
“现在点击”
非常
快速
然后
我
将
成为
一个
文本
结果。
然后
我
将
成为
一个
文本
结果。
请注意,"NOW CLICK"
将被视为单个 标记。因此,即使它包含您要拆分的内部关键字,它也永远不会等于这样的关键字(因为它会包含其他字符,例如 "
,或者只是引号中的其他词。这将防止它被视为定界符,在其上拆分文本。
使用这个想法,我们可以创建如下代码:
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.
关于java - 拆分字符串不包含 java 中的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62686321/