Java 带符号的拉丁正则表达式
我需要拆分一个文本,只得到单词,数字和连字号组成的单词。我还需要得到拉丁语单词,然后我使用了Java 带符号的拉丁正则表达式,java,regex,split,symbols,latin,Java,Regex,Split,Symbols,Latin,我需要拆分一个文本,只得到单词,数字和连字号组成的单词。我还需要得到拉丁语单词,然后我使用了\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 c
\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 );
正则表达式的解释是:
[^\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.
如果我对您要求的理解正确,此正则表达式将符合您的要求:
"\\p{IsLatin}+(?:-\\p{IsLatin}+)*|\\d+"
它将匹配:
- Unicode字符的连续序列。我将其限制为拉丁语脚本,因为
将匹配任何脚本中的字母。如果您的Java版本不支持语法,请将\p{L}
更改为\\p{IsLatin}
\\pL
- 或几个这样的序列,连字符
- 或连续的十进制数字序列(0-9)
模式来使用。编译,并调用匹配器(字符串输入)
,以获得匹配器
对象,并使用循环查找匹配项
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+"
我还在character类['\\-]
中转义-
,以防您想添加更多。实际上,-
如果它是字符类中的第一个或最后一个,则不需要转义,但为了安全起见,我还是转义它。带有[]
的正则表达式集描述只能包含字母、类(\p{…}
)、序列(例如A-z
)和补码(^
)。您必须将正在使用的其他魔法字符(+*()
)放置在[]
块之外。如果字符类的开头括号后面跟着^
,则不允许在类内列出字符。因此,您的正则表达式允许除unicode字母、+
、(
、-
、)
、*
和数字出现一次或多次之外的任何内容
请注意,像+
,(
,)
,*
等字符在字符类中没有任何特殊含义
pattern.split的作用是在匹配正则表达式的模式处拆分字符串。您的正则表达式匹配空格,因此每次出现一个或多个空格时都会发生拆分。所以结果就是这样
例如,考虑这个
Pattern pattern = Pattern.compile("a");
for (String s : pattern.split("sda a f g")) {
System.out.println("==>"+s);
}
输出将是
==>sd
==>
=>f g
你对正则表达式的理解是不正确的<代码>[]
是字符类,只匹配一个字符。是的,它是除此之外的任何字符,因为它用于拆分文本。请参阅:pattern.split(myText)@ManoelMerc我想你误解了pattern.splitIt给了我一个错误:索引12[^\p{IsLatin}+(?:-\p{IsLatin}+)*|\d+]@ManoelMerc附近的未知字符属性名{Latin}+(?:-\p{IsLatin}+)@ManoelMerc:代码可以在Java 7上运行。如果您的版本不支持,则可以恢复到\\p{L}
。不要修改正则表达式!好啊我们快到了!我可以得到所有的字没有错误!谢谢!但管道符号“|”也作为一个单词匹配。我修不好!这是我的代码:Pattern Pattern=Pattern.compile(\\p{L}+(?:-\\p{L}+)*|\\d+);Matcher Matcher=pattern.Matcher(strText.toLowerCase());ArrayList words=新的ArrayList();while(matcher.find()){words.add(matcher.group());}返回words.toArray(新字符串[words.size())@ManoelMerc:|
从未作为单词匹配。这只是正则表达式中的交替。一些结果是:“dresse”//OK“sud est”//OK“|”//错了编译器认为pipe“|”是一个单词,而它不是。我已将其更改为“\(++124;\)+\*++\\\\\\\\\+\\-+\\\+\\[^\\ p{L}+(\-\\p{L}+*\\\\\\+\\\\\\+\\+\\+\\+\\+\+\+\+\\+\\\\\\+++\\\\\+++\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\反正是匹配的…:-(
Pattern pattern = Pattern.compile("a");
for (String s : pattern.split("sda a f g")) {
System.out.println("==>"+s);
}