需要一个需要大写或小写字母的JavaScript正则表达式

Ame*_*men 5 javascript regex

我有一个正则表达式,现在只允许小写字母,我需要一个需要小写或大写字母:

/(?=.*[a-z])/
Run Code Online (Sandbox Code Playgroud)

tch*_*ist 21

你不能从这里到达那里

我有一个正则表达式,现在只允许小写字母,我需要一个需要小写或大写字母: /(?=.*[a-z])/

不幸的是,使用Javascript 完全无法正确执行此操作!阅读这个风味比较的ECMA专栏,了解Javascript 无法做到的所有事情.

理论与实践

小写的正确模式是标准的Unicode派生二进制属性\p{Lowercase},大写的正确模式是类似的\p{Uppercase}.这些是规范性属性,有时在某些特殊情况下包含非字母.

仅使用"常规类别"属性,可以使用Lowercase_Letter \p{Ll},\p{Lu}Uppercase_Letter和\p{Lt}标题字母.请记住,它们是Unicode 中的三种情况,而不是两种情况.有一个标准的别名\p{LC}意味着[\p{Lu}\p{Lt}\p{Ll}].

如果你想有一个字母比是不是小写字母,您可以使用(?=\P{Ll})\pL.写得很简单(?=\P{Lowercase_Letter})\p{Letter}.同样,这些混合了一些可\p{Lowercase}识别的Other_Lowercase代码点.我必须再次强调,Lowercase属性是Lowercase_Letter属性的超集.

记住前面的段落,在我写的较低的地方交换上层,你为大写字母得到同样的东西.

可能的平台

由于对这些基本属性的访问是Unicode正则表达式所需的最低级别的关键功能,因此某些版本的Javascript以我上面编写它们的方式实现它们.但是,Javascript的标准仍然不需要它们,因此您通常不能指望它们.这意味着在Javascript的所有实现下都无法正确执行此操作.

可以最低限度地完成您想要的任务的语言包括:

  • C♯和Java(两只有常规类别)
  • Ruby当且仅当v1.9或更高版本(仅限二进制属性,包括常规类别)
  • PHP和PCRE(仅限常规类别和脚本属性以及一些额外内容)
  • ICU的C++库和Perl,它们都支持所有 Unicode属性

在那些列出的bove中,只有最后一行--ICU和Perl - 严格完全满足所有1级合规性要求(加上一些级别2和3),以正确处理正则表达式中的Unicode.但是,我在前一段子弹中列出的所有内容都可以很容易地处理你需要的大部分内容,而且很可能是所有内容.

但是,Javascript不在其中.但是,您的版本可能非常幸运,而且永远不必在标准的Javascript平台上运行.

摘要

非常遗憾的是,除非你有非标准扩展,否则你不能真正使用Javascript正则表达式进行Unicode工作.有些人这样做,但大多数人没有.如果不这样做,您可能必须使用不同的平台,直到相关的ECMA标准赶上21世纪(Unicode 3.1在十年前问世!!).

如果有人知道Unicode正则表达式实现UTS#18的 1级要求的Javascript库,包括RL1.2"属性"RL1.2a"附件C:兼容性属性",插入.


Pla*_*ure 16

不确定您是指混合大小写,还是严格小写加严格大写.

这是混合案例版本:

/^[a-zA-Z]+$/
Run Code Online (Sandbox Code Playgroud)

严格的一个或另一个版本:

/^([a-z]+|[A-Z]+)$/
Run Code Online (Sandbox Code Playgroud)


Lei*_*igh 8

尝试 /(?=.*[a-z])/i

注意最后的i,这使表达式不区分大小写.

  • 尽管如此,OP接受了你的答案,因为它回答了他/她的问题.放手去做 :-) (2认同)