【问题标题】:java regex to filter out non-English textjava正则表达式过滤掉非英文文本
【发布时间】:2011-06-01 16:29:43
【问题描述】:

我发现了一些关于过滤掉非英语的正则表达式的引用,但其中 none 是在 Java 中,除了他们都提到了一些 different 问题而不是我想要解决的问题:

  1. 替换所有非英文字符 有一个空格。
  2. 创建一个返回true的方法 如果字符串包含任何非英语 字符。

我所说的“英文文本”不仅是指实际的字母和数字,还包括标点符号。

到目前为止,我能够实现的目标 #1 非常简单:

String.replaceAll("\\W", " ")

事实上,如此简单以至于我怀疑我遗漏了一些东西......你发现上面的任何警告了吗?

至于目标#2,我可以简单地在trim() 字符串之后 上面的replaceAll(),然后检查它是否为空。但是...有没有更有效的方法来做到这一点?

【问题讨论】:

  • 有一些合法的英语单词包含重音字符 - 例如“naïve”。
  • 我认为您需要定义“英文文本”的含义......即以下句子是否被视为“英文文本”? “她未婚夫的名字叫何塞·勃朗特。”
  • @Spudley @Nate 当然,你们俩都是正确的。对于我的特殊情况,“她未婚夫的名字是何塞·勃朗特。” not 被认为是 all 英语,因此该方法应返回 true

标签: java regex


【解决方案1】:

事实上,如此简单以至于我怀疑我遗漏了一些东西......你发现上面有什么警告吗?

\W 等价于[^\w]\w 等价于[a-zA-Z_0-9]。使用\W 将替换不是字母、数字或下划线的everything——比如制表符和换行符。这是否是一个问题真的取决于你。

我所说的“英文文本”不仅是指实际的字母和数字,还包括标点符号。

在这种情况下,您可能希望使用省略标点符号的字符类;像

[^\w.,;:'"]

如果字符串包含任何非英文字符,则创建一个返回 true 的方法。

使用PatternMatcher

Pattern p = Pattern.compile("\\W");

boolean containsSpecialChars(String string)
{
    Matcher m = p.matcher(string);
    return m.find();
}

【讨论】:

  • -1 这行不通。您需要使用matcher.find() 或更改您的正则表达式以匹配整个字符串。
【解决方案2】:

这对我有用

  private static boolean isEnglish(String text) {
        CharsetEncoder asciiEncoder = Charset.forName("US-ASCII").newEncoder();
        CharsetEncoder isoEncoder = Charset.forName("ISO-8859-1").newEncoder();
        return  asciiEncoder.canEncode(text) || isoEncoder.canEncode(text);
    }

【讨论】:

    【解决方案3】:

    这是我的解决方案。我假设文本可能包含英文单词、标点符号和标准 ascii 符号,例如 #、%、@ 等。

    private static final String IS_ENGLISH_REGEX = "^[ \\w \\d \\s \\. \\& \\+ \\- \\, \\! \\@ \\# \\$ \\% \\^ \\* \\( \\) \\; \\\\ \\/ \\| \\< \\> \\\" \\' \\? \\= \\: \\[ \\] ]*$";
    
    private static boolean isEnglish(String text) {
    		if (text == null) {
    			return false;
    		}
    		return text.matches(IS_ENGLISH_REGEX);
    	}

    【讨论】:

      【解决方案4】:

      假设一个英文单词由以下字符组成:[a-zA-Z_0-9]

      要在字符串包含任何非英文字符时返回 true,请使用 string.matches

      return !string.matches("^\\w+$");
      

      【讨论】:

      • @dogbane 为什么是^$
      • @regex-rookie 这不是必需的,但我明确表示我从头到尾匹配整个字符串。
      • @dogbane 您的正则表达式似乎不适用于以非英文字符开头(或结尾)的字符串。你能确认一下吗?
      • @regex-rookie 是的。我的语句按要求返回 true。
      • @dogbane 您的正则表达式仍然无法正常工作。尝试在regexplanet.com/simple/index.html 上放置一个只有一个非英文字符的全英文文本,看看我的意思。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-06
      • 1970-01-01
      • 2010-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多