2015-08-19 3 views
5

У меня есть данные, которые подходят для этого шаблона: (x|y). x и y могут быть отрицательными, и в этом случае присутствует знак -. Я пытаюсь построить выражение регулярных выражений в соответствии с x и y.Координата Regex X/Y

Вот мое текущее выражение, которое, кажется, действует на меня, но не работает:

/\((-?\d+)\|(-?\d+)\)/ 

Вот исходные данные:

‭(-112|‭‭-522‬‬) 
‭(-112|‭‭522‬‬) 
(112|-‭‭522‬‬) 
(112|‭‭522‬‬) 

Любые идеи?

+3

Все хорошо. Что с этим не так? – ndn

ответ

4

У вас есть некоторые невидимые символы Юникода в тестовых данных.

Удалите их, и ваше регулярное выражение будет work just fine.

Например, ваш пример (-112|‭‭-522‬‬) - это фактически \u0028\u002d\u0031\u0031\u0032\u007c\u202d\u202d\u002d\u0035\u0032\u0032\u202c\u202c\u0029.

У вас есть несколько U+202D (влево-вправо ПЕРЕОПР) и U+202C (POP DIRECTIONAL ФОРМАТИРОВАНИЕ) там.

Если вы хотите, чтобы они в своем регулярном выражении, вы можете включить их:

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

Но картина становится довольно грязным. Я только что добавил кучу \p{Cf}*, чтобы разрешить эти символы. Обратите внимание, что вам все равно придется избавиться от символов между знаком минус и цифрами, прежде чем пытаться преобразовать захваченные подстроки в целые числа.

Возможно, было бы намного проще заменить все, что соответствует \p{Cf}+, с пустой строкой, прежде чем продолжить свой исходный узор.

+0

Как я могу удалить символы юникода в php? – BadTigrou

+0

@BadTigrou '$ text = preg_replace ('/ \ p {Cf} + /', '', $ text);' –

+0

Молодцы. <°)))))))))))> –

-3

Вы должны избегать знака минус с помощью обратной косой черты \-. Он зарезервирован для моделей, таких как a-z

+4

Здесь нет класса символов. Так что '-' не зарезервирован. – chris85

+0

Вот нить на нем. http://stackoverflow.com/questions/9589074/regex-should-hyphens-be-escaped Я бы удалил этот ответ. – chris85

+0

Спасибо за эту информацию :) – Karl

0

Вы можете проверить это в RegExr, который где я его придумал, но это должно делать то, что вы ищете

Regex код

/\((-?[0-9]+\.?[0-9]+)\|(-?[0-9]+\.?[0-9]+)\)/ 

протестированные значения

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

Я знаю, я не думал об этом, я это исправлю. Что касается g, я заявил, что я использовал regexer, поэтому я просто скопировал его вывод из опции share.Я тоже исправлю – Pazuzu156

+0

Ответ был отредактирован для удаления флага g и исправления нескольких десятичных проблем. – Pazuzu156