正则表达式 X/Y 坐标

5
我有符合以下模式的数据:(x|y)。其中xy可以为负数,此时会出现符号-。 我正试图构建一个正则表达式来匹配xy
这是我目前的表达式,看起来是有效的但不起作用:
/\((-?\d+)\|(-?\d+)\)/

以下是原始数据:
‭(-112|‭‭-522‬‬)
‭(-112|‭‭522‬‬)
(112|-‭‭522‬‬)
(112|‭‭522‬‬)

有什么想法吗?

3
看起来不错。有什么问题吗? - ndnenkov
3个回答

4

你的测试数据中有一些不可见的Unicode字符。

去掉它们,你的正则表达式就会很好地工作

例如,你的例子(-112|‭‭-522‬‬)实际上是\u0028\u002d\u0031\u0031\u0032\u007c\u202d\u202d\u002d\u0035\u0032\u0032\u202c\u202c\u0029

你的一些字符包含了U+202D从左到右覆盖)和U+202C弹出方向格式)。

如果你想在你的正则表达式中允许这些字符,你可以将它们包含在内:

\(\p{Cf}*(-?\p{Cf}*\d+)\p{Cf}*\|\p{Cf}*(-?\p{Cf}*\d+)\p{Cf}*\)

但是这个模式变得相当混乱。我只是添加了一堆\p{Cf}*来允许这些字符。请注意,在尝试将捕获的子字符串转换为整数之前,仍然必须清除减号和数字之间的字符。
在继续使用原始模式之前,直接用空字符串替换与\p{Cf}+匹配的所有内容可能会更简单。

$text = preg_replace('/\p{Cf}+/', '', $text); $text = preg_replace('/\p{Cf}+/', '', $text); - Lucas Trzesniewski

0
你可以在Regexr中测试这个,这就是我想出来的,但这应该能做到你想要的。
正则表达式代码
/\((-?[0-9]+\.?[0-9]+)\|(-?[0-9]+\.?[0-9]+)\)/

已测试的值

(-112|-522)
(-112|522)
(112.35|-522)
(112|522.5)

你知道的,我没有想到那个问题,我会修复它。至于 g,我说过我使用了 regexer,所以我只是从共享选项中复制了它的输出。我也会修复这个问题。 - Pazuzu156
答案已被编辑以删除g标志,并修复了多个小数问题。 - Pazuzu156

-3

你必须使用反斜杠来转义减号,就像这样 \-。它被保留用于模式匹配,例如 a-z


4
这里没有字符类,所以“-”符号并不是保留字符。 - chris85
这里有一个讨论帖子。https://dev59.com/wGkw5IYBdhLWcg3w4eYD 我会删除这个答案。 - chris85

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接