我正在尝试构建将过滤表单字符串所有非字母字符的正则表达式,如果任何字符串包含单引号,那么我想将其保留为规则的例外。
所以例如当我输入
car's34
结果我想得到
car's
当我进入
*&* Lisa's car 0)*
我想得到
Lisa's
目前我使用这个:
string.replaceAll("[^A-Za-z]", "")
但是,它只给了我字母,并删除了所需的单个配额。
这不是工作吗?
[^A-Za-z']
这也将删除不是“part if words”的撇号:
string = string.replaceAll("[^A-Za-z' ]+|(?<=^|\\W)'|'(?=\\W|$)", "")
.replaceAll(" +", " ").trim();
这首先只是将撇号添加到您要保留的字符列表中,但使用环顾四周来查找不在单词中的撇号,所以
I'm a ' 123 & 'test'
会成为
I'm a test
请注意单独的撇号是如何被删除的,以及撇号 wrapping 是如何被删除的test
,但I'm
被保留了。
接下来replaceAll()
是用一个空格替换多个空格,如果输入中有一个单独的撇号,这将导致。trim()
如果它发生在输入的末尾,则添加了进一步的调用。
这是一个测试:
String string = "I'm a ' 123 & 'test'";
string = string.replaceAll("[^A-Za-z' ]+|(?<=^|\\W)'|'(?=\\W|$)", "").replaceAll(" +", " ").trim();
System.out.println(string);
输出:
I'm a test
你可以试试正则表达式:
[^\p{L}' ]
\p{L}
表示 Unicode 字母的类别。
另一方面,您需要使用 Pattern 的常量来避免每次都重新编译表达式,如下所示:
private static final Pattern REGEX_PATTERN =
Pattern.compile("[^\\p{L}' ]");
public static void main(String[] args) {
String input = "*&* Lisa's car 0)*";
System.out.println(
REGEX_PATTERN.matcher(input).replaceAll("")
); // prints " Lisa's car "
}
显而易见的解决方案是:
string.replaceAll("[^A-Za-z']", "")
我怀疑你想要更多的东西。
@Bohemian 有一个好主意,但需要单词边界而不是环顾四周:
string.replaceAll("([^A-Za-z']|\B'|'\B)+", " ");