将php正则表达式转换为java正则表达式
将php正则表达式转换为java正则表达式,java,php,regex,Java,Php,Regex,我需要转换下一个php正则表达式: /^ (?: \d{1,16} | (?: \x0A | \x0D | [\x20-\x5A] | \x5F | [\x61-\x7A] | \xC2\xA0 | \xCE\xA9 ){1,11} ) $/xsi 我刚接触regex,发现了一个有用的链接: 我是否理解正确,我应该只粘贴php正则表达式,按“Test”键,结果如下: '/^ (?: \\d{1,16} | (?: \\x0A | \\x0D | [\\x20-\\x5A] | \\x5F |
我需要转换下一个php正则表达式:
/^ (?: \d{1,16} | (?: \x0A | \x0D | [\x20-\x5A] | \x5F | [\x61-\x7A] | \xC2\xA0 | \xCE\xA9 ){1,11} ) $/xsi
我刚接触regex,发现了一个有用的链接:我是否理解正确,我应该只粘贴php正则表达式,按“Test”键,结果如下:
'/^ (?: \\d{1,16} | (?: \\x0A | \\x0D | [\\x20-\\x5A] | \\x5F | [\\x61-\\x7A] | \\xC2\\xA0 | \\xCE\\xA9 ){1,11} ) $/xsi'
是否可以在Java中工作?您的原始模式看起来很奇怪:用
\x..
编写的大多数字符都在ASCII表中。当您可以为\x0A
编写\n
,为\x0D
编写\r
等时,为什么要使用这种复杂的表示法。?它可以用更简单的方式编写(始终适用于PHP):
(我删除了x修饰符和非有效空格。s修饰符没有用。)
由于模式不区分大小写(修饰符i),[a-z]
已包含在[-z]
中(包含[a-z]
,请参见ASCII表),并且可以删除。另一方面,使用字符类而不是单个字符的交替使用更短、更高效:
/^(?:\d{1,16}|(?:[\n\r -Z_]|\xC2\xA0|\xCE\xA9){1,11})$/i
关于\xC2\xA0
和\xCE\xA9
:这些序列代表UTF8中编码的字符不间断空格
和希腊文大写字母OMEGA
PCRE(PHP正则表达式引擎)默认情况下不支持unicode,而是以单个字节序列(每个字符一个字节)的形式读取字符串。如果添加u
修饰符或使用(*UTF8)
启动模式,则可以将字符串读取为UTF8编码的字符串。在您的模式中,没有u
修饰符,因此每个字节都被视为一个字符
Java正则表达式引擎默认支持unicode,不逐字节读取字符串,而是逐字符读取字符串
为了简化从PHP到Java的“转换”,我将使用u修饰符重写PHP模式:
/^(?:[0-9]{1,16}|[\n\r -Z_\x{00A0}\x{03A9}]{1,11})$/iu
描述每个字节的\xC2\xA0
现在替换为\x{00A0}
,其中00A0
是字符无中断空间的unicode码点。欧米茄也是这样。(看一看)
请注意,u修饰符将\d
扩展到unicode表中的所有数字。为了防止这种副作用,我将其替换为[0-9]
要编写Java模式,只需将\x{..}
语法替换为\u..
语法,并使用不区分大小写的选项:
^(?:[0-9]{1,16}|[\n\r -Z_\u00A0\u03A9]{1,11})$
(别忘了避开反斜杠)非常感谢!我不熟悉regexps,原始regex不是我的,所以我不能说它有什么奇怪的地方。我只需要把它转换成Java。再次感谢!
^(?:[0-9]{1,16}|[\n\r -Z_\u00A0\u03A9]{1,11})$