Java 带撇号字符串的正则表达式

Java 带撇号字符串的正则表达式,java,regex,string,Java,Regex,String,我正在尝试构建正则表达式,它将过滤所有非字母字符,如果任何字符串包含单引号,那么我希望将其作为规则的一个例外 比如说当我进去的时候 car's34 *&* Lisa's car 0)* 因此,我想 car's Lisa's 我进去的时候 car's34 *&* Lisa's car 0)* 我想去 car's Lisa's 现在我用这个: string.replaceAll("[^A-Za-z]", "") 但是,它只给我字母表,并删除了所需的单一配额。显而易见

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

比如说当我进去的时候

car's34
*&* Lisa's car 0)*
因此,我想

car's
Lisa's
我进去的时候

car's34
*&* Lisa's car 0)*
我想去

car's
Lisa's
现在我用这个:

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

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

显而易见的解决方案是:

string.replaceAll("[^A-Za-z']", "")
我想你还想要点什么。

这样行吗


[^A-Za-z']

这也将删除不属于“单词的部分”的撇号:

将成为

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);

您可以尝试使用正则表达式:

[^\p{L}' ]
\p{L}
表示Unicode字母的类别

另一方面,您需要使用模式常量,以避免每次重新编译表达式,类似于:

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']|\B'|'\B)+", " ");

你为什么不想把
car
放在第二个字符串中?我编辑了给定的示例,第二个示例中的“Lisa”部分和“car”部分有什么不同?为什么保留“Lisa's”而不是“car”?Luke我看不到这部分有任何编辑。给定示例中的代码颜色并不重要。我想知道的是,您是否希望12'ape'45变成'ape'ape?这正是我想要的!我真不敢相信我错过了这个!谢谢你的呼呼声-漏掉了一个“=”。现在试试!我得到
I'matest'
。发生什么事了?@PaulVargas我的错-我漏掉了一个空间。现在试试,哼。。。与
我是一个'123&'test'
=>
我是一个测试
一起工作。但是对于
我是一个'123&'test'
,我得到了
我是一个test'
@PaulVargas好的,也解决了这个问题。感谢您的耐心和反馈。我真的应该测试一下,嗯……什么是
\B
片段?\B匹配单词边界,\B匹配非单词边界