提取单词 - 包括大写小写字母不适用于只提取字符的单词
Extracting words with - included upper lowercase not working for words it only extracts chars
我正在尝试使用正则表达式匹配器和模式从字符串中提取几个单词。我确实花了一些时间来制作我正在使用的正则表达式,但这并没有按预期工作,我们将不胜感激。
我创建了我正在使用的正则表达式,但它没有按预期工作,如果有一些帮助会很好。我可以从我想要的单词中提取字符,但不能提取整个单词。
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main (String[] args){
String mebo = "1323 99BIMCP 1 2 BMWQ-CSPS-D1, 0192, '29229'";
Pattern pattern = Pattern.compile("[((a-zA-Z1-9-0)/W)]");
Matcher matcher = pattern.matcher(mebo);
while (matcher.find()) {
System.out.printf("Word is %s %n",matcher.group(0));
}
}
}
This is current output:
Word is 1 Word is 3 Word is 2 Word is 3 Word is 9 Word is 9 Word
is B Word is I Word is M Word is C Word is P Word is 1 Word is 2
Word is B Word is M Word is W Word is Q Word is - Word is C Word
is S Word is P Word is S Word is - Word is D Word is 1 Word is 0
Word is 1 Word is 9 Word is 2 Word is 2 Word is 9 Word is 2 Word
is 2 Word is 9
============
我的期望是迭代整个单词,例如:
String mebo = "1323 99BIMCP 1 2 BMWQ-CSPS-D1, 0192, '29229'"
word is 1323 word is 99BIMCP word is 1 word is 2 word is BMWQ-CSPS-D1
word is 0192 word is 29229
这里最简单的解决方案似乎是完全放弃正则表达式,而是拆分字符串。您希望在您的单词中允许数字、字母字符和 -
。考虑以下代码:
for (String word : mebo.split("[^\d\w-]+")) {
System.out.printf("Word is %s %n", word);
}
这应该表现出预期的行为。请注意,这将生成一些空字符串,除非您在拆分模式中有 +
。
这样做是将输入字符串拆分为不匹配您所需字符的所有内容。这是通过使用倒置字符 class.
来实现的
我建议先拆分正则表达式,然后替换正则表达式:
String mebo = "1323 99BIMCP 1 2 BMWQ-CSPS-D1, 0192, '29229'";
String[] parts = mebo.split("\s*,?\s+");
for (String part : parts) {
System.out.println(part.replaceAll("[']", ""));
}
1323
99BIMCP
1
2
BMWQ-CSPS-D1
0192
29229
此处的逻辑是按空格拆分,可能包括逗号分隔符。然后,我们可以进行正则表达式替换清理以删除杂散字符,例如单引号。双引号和任何其他不需要的字符可以很容易地添加到用于替换的字符 class 中。
一般来说,单靠正则表达式在这里可能是不够的,您可能需要一个解析器来涵盖所有边缘情况。例如,考虑以下输入行:
One, "Two or more", Three
我的回答在这里失败了,因为它盲目地根据空格进行拆分,并且不知道转义的空格不是令牌。正则表达式在这里也会失败。
您可以使用它,因为从您的正则表达式看来您希望在匹配中包含 character
digit
和 -
。
`[\w-]+`
[\w-]+
- 匹配 (a-z 0-9 _ 和 - ) 一次或多次。
我正在尝试使用正则表达式匹配器和模式从字符串中提取几个单词。我确实花了一些时间来制作我正在使用的正则表达式,但这并没有按预期工作,我们将不胜感激。
我创建了我正在使用的正则表达式,但它没有按预期工作,如果有一些帮助会很好。我可以从我想要的单词中提取字符,但不能提取整个单词。
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main (String[] args){
String mebo = "1323 99BIMCP 1 2 BMWQ-CSPS-D1, 0192, '29229'";
Pattern pattern = Pattern.compile("[((a-zA-Z1-9-0)/W)]");
Matcher matcher = pattern.matcher(mebo);
while (matcher.find()) {
System.out.printf("Word is %s %n",matcher.group(0));
}
}
}
This is current output:
Word is 1 Word is 3 Word is 2 Word is 3 Word is 9 Word is 9 Word is B Word is I Word is M Word is C Word is P Word is 1 Word is 2 Word is B Word is M Word is W Word is Q Word is - Word is C Word is S Word is P Word is S Word is - Word is D Word is 1 Word is 0 Word is 1 Word is 9 Word is 2 Word is 2 Word is 9 Word is 2 Word is 2 Word is 9
============
我的期望是迭代整个单词,例如:
String mebo = "1323 99BIMCP 1 2 BMWQ-CSPS-D1, 0192, '29229'"
word is 1323 word is 99BIMCP word is 1 word is 2 word is BMWQ-CSPS-D1 word is 0192 word is 29229
这里最简单的解决方案似乎是完全放弃正则表达式,而是拆分字符串。您希望在您的单词中允许数字、字母字符和 -
。考虑以下代码:
for (String word : mebo.split("[^\d\w-]+")) {
System.out.printf("Word is %s %n", word);
}
这应该表现出预期的行为。请注意,这将生成一些空字符串,除非您在拆分模式中有 +
。
这样做是将输入字符串拆分为不匹配您所需字符的所有内容。这是通过使用倒置字符 class.
来实现的我建议先拆分正则表达式,然后替换正则表达式:
String mebo = "1323 99BIMCP 1 2 BMWQ-CSPS-D1, 0192, '29229'";
String[] parts = mebo.split("\s*,?\s+");
for (String part : parts) {
System.out.println(part.replaceAll("[']", ""));
}
1323
99BIMCP
1
2
BMWQ-CSPS-D1
0192
29229
此处的逻辑是按空格拆分,可能包括逗号分隔符。然后,我们可以进行正则表达式替换清理以删除杂散字符,例如单引号。双引号和任何其他不需要的字符可以很容易地添加到用于替换的字符 class 中。
一般来说,单靠正则表达式在这里可能是不够的,您可能需要一个解析器来涵盖所有边缘情况。例如,考虑以下输入行:
One, "Two or more", Three
我的回答在这里失败了,因为它盲目地根据空格进行拆分,并且不知道转义的空格不是令牌。正则表达式在这里也会失败。
您可以使用它,因为从您的正则表达式看来您希望在匹配中包含 character
digit
和 -
。
`[\w-]+`
[\w-]+
- 匹配 (a-z 0-9 _ 和 - ) 一次或多次。