我有一个字符串:
"cards_NNS may_MD be_VB worth_JJ hundreds_NNS a_DT report_NN"
现在我试图从给定字符串中的字符串数组中获取这些单词,该字符串在单词的末尾有_NNS and _NN and _JJ
。
输出:
cards worth hundreds report
我的尝试:
string.split("[^_NNS]+");
请给我一些想法。
答案 0 :(得分:1)
您可以在此处使用Pattern
和Matcher
:
String str = "cards_NNS may_MD be_VB worth_JJ hundreds_NNS a_DT report_NN";
Matcher matcher = Pattern.compile("(\\w+?)_(?:NNS|JJ|NN)\\b").matcher(str);
while (matcher.find()) {
System.out.println(matcher.group(1));
}
这将找到所有那些以_NNS
或_JJ
或_NN
结尾的单词序列。然后第一个捕获组捕获_
之前的字符串。
答案 1 :(得分:0)
<强>码强>
String val = "cards_NNS may_MD be_VB worth_JJ hundreds_NNS a_DT report_NN";
String[] allVal = val.split(" ");
for(String each: allVal){
if(each.endsWith("_NNS") || each.endsWith("_NN") || each.endsWith("_JJ")){
System.out.println(each);
}
}
<强>输出:强>
cards_NNS
worth_JJ
hundreds_NNS
report_NN
修改强>
<强>码强>
String val = "cards_NNS may_MD be_VB worth_JJ hundreds_NNS a_DT report_NN";
String[] allVal = val.split(" ");
for(String each: allVal){
if(each.endsWith("_NNS") ){
System.out.println(each.substring(0, each.length() - 4));
}else if(each.endsWith("_NN") || each.endsWith("_JJ")){
System.out.println(each.substring(0, each.length() - 3));
}
}
<强>输出强>
cards
worth
hundreds
report
答案 2 :(得分:0)
如果您想在一次拆分操作中执行此操作,这将成为一个相当复杂的正则表达式。这是一种有效的方法:
String input = "cards_NNS may_MD be_VB worth_JJ hundreds_NNS a_DT report_NN";
String[] output = input.split("_(JJ|NNS?).*?(?=\\b(\\w*_(JJ|NNS?)|$))");
System.out.println(Arrays.toString(output));
打印
[cards, worth, hundreds, report]
正则表达式首先找到_JJ
,_NN
或_NNS
的后缀。然后它会继续,直到找到以上述后缀之一结尾的单词或字符串的结尾($
)。
答案 3 :(得分:0)
试试这个:
String str = "cards_NNS may_MD be_VB worth_JJ hundreds_NNS a_DT report_NN";
Pattern pattern = Pattern.compile("([^\\s]+?)_(NNS|NN|JJ)\\b");
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
System.out.println(matcher.group(1));
}
输出:
卡片价值数百份报告