2

我正在尝试构建将过滤表单字符串所有非字母字符的正则表达式,如果任何字符串包含单引号,那么我想将其保留为规则的例外。

所以例如当我输入

car's34

结果我想得到

car's

当我进入

*&* Lisa's car 0)*

我想得到

Lisa's

目前我使用这个:

string.replaceAll("[^A-Za-z]", "")

但是,它只给了我字母,并删除了所需的单个配额。

4

5 回答 5

5

这不是工作吗?

[^A-Za-z']

于 2013-08-20T20:43:10.157 回答
5

这也将删除不是“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
于 2013-08-20T20:49:33.240 回答
2

你可以试试正则表达式:

[^\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 "
}
于 2013-08-20T21:00:59.273 回答
2

显而易见的解决方案是:

string.replaceAll("[^A-Za-z']", "")

我怀疑你想要更多的东西。

于 2013-08-20T20:42:57.233 回答
1

@Bohemian 有一个好主意,但需要单词边界而不是环顾四周:

string.replaceAll("([^A-Za-z']|\B'|'\B)+", " ");
于 2013-08-20T22:41:23.770 回答