我有一个任意长度的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的新手
答案 0 :(得分:11)
在RFC定义之外发生的A-Z
或0-9
等范围的所有实例在Unicode中实际上总是 ipso facto 错误。特别是像[A-Za-z]
这样的东西是可怕的反模式:他们肯定会给程序员一个关于文本的穴居人心态,这几乎完全不适合千禧年这一方面。 Unicode模式适用于ASCII,但ASCII模式在Uniocode上中断,有时会让您对安全违规行为开放。无论您使用的是20世纪70年代的数据,还是总是编写模式的Unicode版本。现代的Unicode,因为这样你在实际使用真正的Java字符数据时就不会搞砸了。这就像你使用转向信号的方式,即使你“知道”你身后没有人,因为如果你错了,你没有伤害,而另一方面,你肯定会这样做。习惯使用7种Unicode类别:
\pL
来信。请注意,\pL
的输入要比[A-Za-z]
短得多。\pN
代表数字。\pM
用于与其他代码点结合使用的标记。\pS
用于符号,符号和印记。 :)\pP
用于标点符号。\pZ
用于分隔符,例如空格(但不是控制字符)\pC
用于其他不可见的格式和控制字符,包括未分配的代码点。如果你只想要一个模式,你想要
^[\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来测试几个字符串。
添加字母字符似乎很容易,但可能需要重复给定的正则表达式。