Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/239.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将php正则表达式转换为java正则表达式_Java_Php_Regex - Fatal编程技术网

将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})$