我需要拆分文本,只获得单词,数字和带连字符的组合词。我也需要拉丁语,然后我使用了\p{L}
,它给了我é,úüã,等等。例子是:
String myText = "Some latin text with symbols, ? 987 (A la pointe sud-est de l'île se dresse la cathédrale Notre-Dame qui fut lors de son achèvement en 1330 l'une des plus grandes cathédrales d'occident) : ! @ # $ % ^& * ( ) + - _ #$% " ' : ; > < / \ | , here some is wrong… * + () e -"
Pattern pattern = Pattern.compile("[^\\p{L}+(\\-\\p{L}+)*\\d]+");
String words[] = pattern.split( myText );
这个正则表达式出了什么问题?为什么它匹配"("
,"+"
,"-"
,"*"
和"|"
等符号?
一些结果是:
dresse // OK
sud-est // OK
occident) // WRONG
987 // OK
() // WRONG
(a // WRONG
* // WRONG
- // WRONG
+ // WRONG
( // WRONG
| // WRONG
正则表达式的解释是:
[^\p{L}+(\-\p{L}+)*\d]+
* Word separator will be:
* [^ ... ] No sequence in:
* \p{L}+ Any latin letter
* (\-\p{L}+)* Optionally hyphenated
* \d or numbers
* [ ... ]+ once or more.
答案 0 :(得分:2)
如果我对您的要求的理解是正确的,那么此正则表达式将符合您的要求:
"\\p{IsLatin}+(?:-\\p{IsLatin}+)*|\\d+"
它将匹配:
\p{L}
将匹配任何脚本中的字母。如果您的Java版本不支持语法,请将\\p{IsLatin}
更改为\\pL
。通过调用Pattern.compile
来使用上面的正则表达式,并调用matcher(String input)
来获取Matcher
对象,并使用循环来查找匹配项。
Pattern pattern = Pattern.compile("\\p{IsLatin}+(?:-\\p{IsLatin}+)*|\\d+");
Matcher matcher = pattern.matcher(inputString);
while (matcher.find()) {
System.out.println(matcher.group());
}
如果您想允许包含撇号'
的单词:
"\\p{IsLatin}+(?:['\\-]\\p{IsLatin}+)*|\\d+"
我还在角色类-
中转义['\\-]
,以防您想要添加更多内容。实际上-
如果它是角色类中的第一个或最后一个,则不需要转义,但为了安全起见我无论如何都要逃避它。
答案 1 :(得分:2)
如果字符类的左括号后跟^
,则不允许在类中列出的字符。所以你的正则表达式允许除之外的任何内容,+
,(
,-
,)
,*
和数字出现的或更多次。
请注意,+
,(
,)
,*
等字符在字符类中没有任何特殊含义。
pattern.split的作用是将字符串拆分为与正则表达式匹配的模式。你的正则表达式匹配空格,因此在每次出现一个或多个空格时会发生拆分。结果就是这样。
例如考虑这个
Pattern pattern = Pattern.compile("a");
for (String s : pattern.split("sda a f g")) {
System.out.println("==>"+s);
}
输出
==&GT; SD
==&GT;
==&GT; f g
答案 2 :(得分:0)
包含[]
的正则表达式集描述只能包含字母,类(\p{...}
),序列(例如a-z
)和补码符号(^
)。您必须将您正在使用的其他魔术角色(+*()
)放在<{em} [ ]
块之外。