Unicode регулярное выражение для соответствия переносам строк? - PullRequest
2 голосов
/ 08 декабря 2010

У меня есть эта форма, откуда я хочу отправить данные в базу данных. Данные UTF8. У меня проблемы с соответствием разрывов строк. Шаблон, который я использую, выглядит примерно так:

~^[\p{L}\p{M}\p{N} ]+$~u

Этот шаблон работает нормально, пока пользователь не поместит новую строку в своем текстовом поле. Я пытался использовать \p{Z} внутри класса, но безуспешно. Я также попробовал "s", но это не сработало.

Любая помощь очень ценится. Спасибо!

1 Ответ

3 голосов
/ 08 декабря 2010

Разрыв строки Unicode - это либо возврат каретки, за которым сразу следует перевод строки, либо это любой символ со свойством вертикального пробела.

Но похоже, что вы пытаетесь найти общий пробел там. На Java это будет

 [\u000A\u000B\u000C\u000D\u0020\u0085\u00A0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u2028\u2029\u202F\u205F\u3000]

, который можно сократить, используя диапазоны для «только» этого:

 [\u000A-\u000D\u0020\u0085\u00A0\u1680\u180E\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]

, чтобы включить как горизонтальные пробелы (\h), так и вертикальные пробелы (\v), которые могут совпадать или не совпадать с общими пробелами (\s).

Похоже, вы пытаетесь сопоставить буквенно-цифровые символы.

  • Алфавит обычно один [\pL\pM\p{Nl}].
  • Числа не так часто все \pN так часто, как они или просто \p{Nd} или иногда [\p{Nd}\p{Nl}].
  • Для символов идентификатора требуется пунктуация соединителя и немного больше, поэтому [\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]] - если ваш движок регулярных выражений поддерживает такие операции (в Java это делается). Это то, с чем \w работает в языках регулярных выражений, поддерживающих Юникод (к которым не относится Java).

В старых версиях Perl вы, скорее всего, пишете перевод строки как

 (?:\r\n|\p{VertSpace})

хотя теперь это лучше записать как

 (?:(?>\r\n)|\v)

это именно то, что

 \R

спички.

Ява очень неуклюжа в этих вещах. Там вы должны написать перевод строки как

  (?:(?>\u000D\u000A)|[\u000A-\u000D\u0085\u2028\u2029])

что, конечно, требует дополнительной bbaacckkssllasshheess при написании в виде строки.

Другие Java-эквиваленты для 14 общих регулярных выражений класса символов, так что они работают с Unicode, я даю в этом ответе . Возможно, вам придется использовать те из других Java-подобных языков регулярных выражений, которые недостаточно осведомлены о Unicode.

...