Java 正则表达式是否要删除所有具有通用语言支持的非字母数字字符?

Java 正则表达式是否要删除所有具有通用语言支持的非字母数字字符?,java,regex,string,replace,Java,Regex,String,Replace,我想使用模式的编译方法来实现这一点。比如 String text = "Where? What is that, an animal? No! It is a plane."; Pattern p = new Pattern("*some regex here*"); String delim = p.matcher(text).replaceAll(""); 什么是正则表达式可以实现我想要实现的目标 示例字符串: 英式 Input: "Where? What is that, an anim

我想使用模式的编译方法来实现这一点。比如

String text = "Where? What is that, an animal? No! It is a plane.";
Pattern p = new Pattern("*some regex here*");
String delim = p.matcher(text).replaceAll("");
什么是正则表达式可以实现我想要实现的目标

示例字符串:

英式

Input: "Where? What is that, an animal? No! It is a plane."
Output: "Where What is that an animal No It is a plane"
西班牙文

Input: "¿Dónde? ¿Qué es eso, un animal? ¡No! Es un avión."
Output: "Dónde Qué es eso un animal No Es un avión"
葡萄牙人

Input: "Onde? O que é isso, um animal? Não! É um avião."
Output: "Onde O que é isso um animal Não É um avião"
希望这些例子能清楚地说明我想要实现的目标。
谢谢大家

我不是世界上所有语言的专家,但是,您的要求可以在特定语言的基础上实现:

Regex rgx = new Regex("[^a-zA-Z0-9 <put language specific characters to preserve here>]");
str = rgx.Replace(str, "");

我不是世界上所有语言的专家,但是,您的要求可以在特定语言的基础上实现:

Regex rgx = new Regex("[^a-zA-Z0-9 <put language specific characters to preserve here>]");
str = rgx.Replace(str, "");
Java类是正则表达式的Java实现,它支持,例如
\p{Lu}
。因为您需要字母数字,所以应该是
L
(字母)和
N
(数字)

因为您的示例显示您也希望保留空格,所以需要将其包括在内。让我们使用
\s
,这样您还可以保留换行符和制表符

要查找除指定字符以外的任何字符,请使用:
[^abc]

总之,这意味着
[^\s\p{L}\p{N}]

String output = input.replaceAll("[^\\s\\p{L}\\p{N}]+", "");
那是什么动物不,那是飞机 这是一种动物,不是一种动物 这是一种动物的生活方式 或查看演示


当然,有多种方法可以做到这一点

您也可以使用
\p{Alnum}
,然后使用
(?U)
启用

那是什么动物不,那是飞机 这是一种动物,不是一种动物 这是一种动物的生活方式
现在,如果您不需要空格,可以使用
\p{xx}
来简化:

String output = input.replaceAll("(?U)\\P{Alnum}+", "");
何处是安乃近
DóndeQuéesesounanimalNoEsunavión
OndeOqueéissoumanimalNãoÉumavião
Java类是正则表达式的Java实现,它支持,例如
\p{Lu}
。因为您需要字母数字,所以应该是
L
(字母)和
N
(数字)

因为您的示例显示您也希望保留空格,所以需要将其包括在内。让我们使用
\s
,这样您还可以保留换行符和制表符

要查找除指定字符以外的任何字符,请使用:
[^abc]

总之,这意味着
[^\s\p{L}\p{N}]

String output = input.replaceAll("[^\\s\\p{L}\\p{N}]+", "");
那是什么动物不,那是飞机 这是一种动物,不是一种动物 这是一种动物的生活方式 或查看演示


当然,有多种方法可以做到这一点

您也可以使用
\p{Alnum}
,然后使用
(?U)
启用

那是什么动物不,那是飞机 这是一种动物,不是一种动物 这是一种动物的生活方式
现在,如果您不需要空格,可以使用
\p{xx}
来简化:

String output = input.replaceAll("(?U)\\P{Alnum}+", "");
何处是安乃近
DóndeQuéesesounanimalNoEsunavión
OndeOqueéissoumanimalNãoÉumavião

在普通话中这样说毫无意义,因为字符既不是元音也不是字母,而是逻辑发音。至于你给我们的罗曼史语言的例子,你可能需要手动列出一些东西。每种语言都有自己的符号,这些符号在ASCII表的不同位置显示。此外,您需要详细检查它,并创建适当的链,如[^a-zA-Z0-9]非字母数字是\W(除非您也不需要下划线)空格是非字母数字字符,因此输出将是
“wherettisthatananimalnoitisaplane”
。对于普通话来说,建议这样做毫无意义,因为字符既不是元音,也不是字母,但听起来很合乎逻辑。至于你给我们的罗曼史语言的例子,你可能需要手动列出一些东西。每种语言都有自己的符号,这些符号在ASCII表的不同位置显示。此外,您需要检查它的详细信息并创建适当的链,如[^a-zA-Z0-9]非字母数字是\W(除非您也不需要下划线)空格是非字母数字字符,因此输出将是
“wherewhatissthatananimalnoitisaplane”
。谢谢。这么多细节,我很感激。不过,还有一个问题——是否可以执行您创建的操作,但改用Pattern类?我听说过在处理大型数据集和多次迭代时使用String.replaceAll()的坏处。Pattern.compile允许您只声明一次正则表达式,而不是每次迭代都声明一次。如果你知道我该怎么做,请告诉我!Thanks@JimmyLee的javadoc说明了您需要知道的一切:以
str.replaceAll(regex,repl)
的形式调用此方法会产生与表达式
Pattern.compile(regex).matcher(str).replaceAll(repl)
Da̱nx̱a̱laga̱lit a̱n成为Danxalagalit An完全相同的结果,所以正则表达式不是很普遍。添加
\p{InCombiningDiacriticalMarks}
将保留变音符号。谢谢。这么多细节,我很感激。不过,还有一个问题——是否可以执行您创建的操作,但改用Pattern类?我听说过在处理大型数据集和多次迭代时使用String.replaceAll()的坏处。Pattern.compile允许您只声明一次正则表达式,而不是每次迭代都声明一次。如果你知道我该怎么做,请告诉我!Thanks@JimmyLee的javadoc说明了您需要知道的一切:以
str.replaceAll(regex,repl)
的形式调用此方法会产生与表达式
Pattern.compile(regex).matcher(str).replaceAll(repl)
Da̱nx̱a̱laga̱lit a̱n成为Danxalagalit An完全相同的结果,所以正则表达式不是很普遍。添加
\p{InCombiningDiacriticalMarks}
将保留变音符号。