我有许多String
之类的:
String str = "camera+app,mountain,lord+kelvin,man,square+format,+-+,sea,e2";
我想创建一个新的String
:
所需的输出应为:
camera app mountain lord kelvin man square format sea
,所以我认为正则表达式可能会成功。
我试过
Pattern pattern = Pattern.compile("(?\\p{Punct})?([\\w]]{3,}*)(?\\p{Punct})?");
Matcher matcher = pattern.matcher(str);
int i = 1;
if(matcher.matches()) {
while(matcher.find()) {
System.out.print(matcher.group(i++) + " ");
}
}
显然无法正常工作(正如您对本文所期望的那样)。
表达我的观点:
(?\\p{Punct})?
作为可选的非捕获标点符号([\\w]]{3,}*)
应该捕获所需的子字符串和(?\\p{Punct})?
是捕获以下标点符号。我想这不会照顾多个标点符号,但我想稍后再处理。
我总是遇到一些正则表达式的麻烦,所以我有点卡住了。
当我在enter link description here导入我的正则表达式时,我得到一个特殊的错误(至少对我而言)Unknown inline modifier near index 2
\\
。
答案 0 :(得分:2)
您的代码无效,因为您的正则表达式有问题。你可以使用这个正则表达式:
\p{Punct}*(\w{3,})\p{Punct}*
另请注意此更正后的代码:
Pattern pattern = Pattern.compile("\\p{Punct}*(\\w{3,})\\p{Punct}*");
Matcher matcher = pattern.matcher(str);
while(matcher.find()) {
System.out.print(matcher.group(1) + " ");
}
答案 1 :(得分:1)
如果我理解你的问题(来自你的输入/输出),你可以用一个单一空格的1+量词替换标点符号:
String str = "camera+app,mountain,lord+kelvin,man,square+format,+-+,sea";
System.out.println(str.replaceAll("\\p{Punct}+", " "));
修改(I)
如果要限制replaceAll
所选单词的大小,可以使用以下顺序替换。请注意,这不是那么优雅,也不像单个替换那样好;
System.out.println(
str.replaceAll("\\p{Punct}+|\\b\\w{1,2}\\b", " ").replaceAll("\\s+", " ")
);
<强>输出强>
camera app mountain lord kelvin man square format sea
备注强>
您还可以将替换结果逐项列入array
。例如:
System.out.println(Arrays.toString(str.split("\\p{Punct}+")));
编辑(II) 要在逐项列出元素时限制单词的大小,可以使用以下模式:
System.out.println(
Arrays.toString(str.split("(^|\\W+?)\\w{1,2}(\\W+?|$)|\\p{Punct}+"))
);
<强>输出强>
[camera, app, mountain, lord, kelvin, man, square, format, sea]