使用正则表达式检查特定字符串

时间:2011-08-24 13:45:16

标签: java regex string unicode character-properties

我有一个任意长度的Type String列表,我需要确保列表中的每个String元素都是字母数字或数字,没有空格和特殊字符,如- \ / _等。

接受的字符串示例包括:

J0hn-132ss/sda
Hdka349040r38yd
Hd(ersd)3r4y743-2\d3
123456789

不可接受的字符串示例包括:

Hello
Joe
King
等等基本上没有言语。

我目前正在使用stringInstance.matches("regex")但不太确定如何编写适当的表达式

if (str.matches("^[a-zA-Z0-9_/-\\|]*$")) return true; 
else return false;

对于不符合我提到的格式的单词,此方法将始终返回true

我正在用英语寻找正则表达式的描述如下:
任何String,其中String包含来自(a-zA-Z和0-9 AND特殊字符)的字符 或(0-9和特殊字符)
或(0-9)

编辑:我已经提出了下面的表达方式,但我认为它可能是不好的,因为它不清楚或复杂。

表达式:

(([\\pL\\pN\\pP]+[\\pN]+|[\\pN]+[\\pL\\pN\\pP]+)|([\\pN]+[\\pP]*)|([\\pN]+))+

我用这个网站来帮助我:http://xenon.stanford.edu/~xusch/regexp/analyzer.html
请注意,我仍然是regex的新手

4 个答案:

答案 0 :(得分:11)

警告:“从不”写 A-Z

在RFC定义之外发生的A-Z0-9等范围的所有实例在Unicode中实际上总是 ipso facto 错误。特别是像[A-Za-z]这样的东西是可怕的反模式:他们肯定会给程序员一个关于文本的穴居人心态,这几乎完全不适合千禧年这一方面。 Unicode模式适用于ASCII,但ASCII模式在Uniocode上中断,有时会让您对安全违规行为开放。无论您使用的是20世纪70年代的数据,还是总是编写模式的Unicode版本。现代的Unicode,因为这样你在实际使用真正的Java字符数据时就不会搞砸了。这就像你使用转向信号的方式,即使你“知道”你身后没有人,因为如果你错了,你没有伤害,而另一方面,你肯定会这样做。习惯使用7种Unicode类别:

  1. \pL来信。请注意,\pL的输入要比[A-Za-z]短得多。
  2. \pN代表数字。
  3. \pM用于与其他代码点结合使用的标记。
  4. \pS用于符号,符号和印记。 :)
  5. \pP用于标点符号。
  6. \pZ用于分隔符,例如空格(但不是控制字符)
  7. \pC用于其他不可见的格式和控制字符,包括未分配的代码点。

  8. 解决方案

    如果你只想要一个模式,你想要

     ^[\pL\pN]+$
    

    虽然在Java 7中你可以这样做:

     (?U)^\w+$
    

    假设您不介意带有任意组合标记的下划线和字母。否则你必须写得非常尴尬:

     (?U)^[[:alpha:]\pN]+$
    

    (?U)是Java 7的新功能。它对应于Pattern类的UNICODE_CHARACTER_CLASSES编译标志。它切换POSIX字符类(如[:alpha:])和简单快捷方式(如\w)以实际使用完整的Java字符集。通常,它们仅适用于1970年代的ASCII集,这可能是一个安全漏洞。

    没有办法让Java 7总是在没有被告知的情况下使用它的模式执行此操作,但是您可以编写一个前端函数来为您执行此操作。你只需要记得给你打电话。

    请注意,v1.7之前的Java模式无法按照UTS#18 on Unicode Regular Expressions所说的方式工作。因此,如果不使用新的Unicode标志,就会对各种错误,缺陷和悖论敞开大门。例如,找不到普通模式\b\w+\b以匹配字符串"élève"中的任何位置,更不用说完全匹配了。

    因此,如果你在1.7之前的Java中使用模式,你需要非常小心,比以往任何时候都要小心。您不能使用任何POSIX charclasses或charclass快捷方式,包括\w\s\b,除了石器时代的ASCII数据之外,所有这些都会中断。它们不能用于Java的本机字符集。

    在Java 7中,他们可以 - 但只能使用正确的标志。

答案 1 :(得分:1)

可以将所需正则表达式的描述重新标记为“包含至少一个数字”,以便followind工作/.*[\pN].*/。或者,如果您希望将搜索限制为字母数字和标点符号,请使用/[\pL\pN\pP]*[\pN][\pL\pN\pP]*/。我已经在你的例子上测试了它,它运行正常。

您可以使用此/.*?[\pN].*?/之类的延迟量词来进一步优化您的正则表达式。这样,如果没有数字,它会更快失败。

我想建议你一本关于正则表达式的好书:Mastering regular expressions,它有一个很好的介绍,深入解释正则表达式如何工作,以及java中正则表达式的章节。

答案 2 :(得分:0)

看起来你只想确保字符串中没有空格。如果是这样,你可以这么简单:

return str.indexOf(" ") == -1;

如果没有空格(由我对你的规则的理解有效),这将返回true,如果字符串中的任何地方有空格(无效),则返回false。

答案 3 :(得分:0)

这是一个部分答案,它执行0-9和特殊字符OR 0-9。

^([\d]+|[\\/\-_]*)*$

这可以读作((1位或更多位数)或(0或更多特殊字符\ / -'_'))0次或更多次。它需要一个数字,只取数字,并拒绝仅包含特殊字符的字符串。

我使用regex tester来测试几个字符串。

添加字母字符似乎很容易,但可能需要重复给定的正则表达式。