具有撇号的字符串的正则表达式

时间:2013-08-20 20:38:55

标签: java regex string

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

所以例如我输入

car's34

因此我想得到

car's

当我进入

*&* Lisa's car 0)*

我想要

Lisa's

目前我用这个:

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

然而,它只给我字母表,并删除了所需的单个配额。

5 个答案:

答案 0 :(得分:4)

这不起作用吗?

[^A-Za-z']

答案 1 :(得分:4)

这也将删除不是“如果是单词”的撇号:

string = string.replaceAll("[^A-Za-z' ]+|(?<=^|\\W)'|'(?=\\W|$)", "")
    .replaceAll(" +", " ").trim();

这首先只是将撇号添加到你想要保留的字符列表中,但是使用环顾四周来查找不在单词中的撇号,所以

I'm a ' 123 & 'test'

会变成

I'm a test

注意如何移除孤立撇号,以及包裹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

答案 2 :(得分:2)

显而易见的解决方案是:

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

我怀疑你想要更多东西。

答案 3 :(得分: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 "
}

答案 4 :(得分:1)

@Bohemian有一个好主意但是要求使用单词边界而不是环顾:

string.replaceAll("([^A-Za-z']|\B'|'\B)+", " ");