Это регулярное выражение совпадает в BBEdit и regex.com, но не в iOS - почему? - PullRequest
1 голос
/ 08 мая 2019

Я пытаюсь «выделить» ссылки на законодательные акты в тексте, который я показываю. Эти ссылки имеют вид <number>-<number>-<number>(char)(char), где:

  • «число» может быть целыми числами 18 или десятичными числами 12.5;
  • круглые скобки являются необязательными: ноль, один или несколько;
  • если термин в скобках существует, между последним числом и первой скобкой может быть или не быть пробел, как в 18-1.3-401(8)(g) или 18-3-402 (2).

Я использую регулярное выражение

((\d+(\.\d+)*-){2}(\d+(\.\d+)*))( ?(\([0-9a-zA-Z]+\))*)

чтобы найти диапазоны этих строк и затем выделить их в моем тексте. Это выражение работает отлично, 100% времени, во всех случаях, которые я пробовал (десятки), в BBEdit, а также на regex101.com и regexr.com.

Тем не менее, когда я использую то же самое выражение в своем коде, на iOS 12.2, очень сложно определить, действительно ли найдена строка, соответствующая регулярному выражению. Фактически, настолько просто, что строка в том же виде, что и два других совпадения в определенном фрагменте текста, НЕ найдена. Например, в этом одном абзаце у меня есть пять случаев xxx-x-xxx; первое и последнее совпадают, но средние три не совпадают. Это не имеет смысла для меня.

Я использую String метод func range(of:options:range:locale:) с параметрами .regularExpressionnil locale) для сопоставления. Я вижу, что iOS использует ICU-совместимые регулярные выражения, тогда как эти другие инструменты используют PCRE (я думаю). Но, насколько я могу судить, мое выражение должно быть совместимым и действительным для моего случая с анализом ICU. Но что-то определенно отличается, и я не могу понять, что это такое.

Кто-нибудь? (Я собираюсь попробовать NSRegularExpression и посмотреть, будет ли он вести себя по-другому, но я все же хотел бы выяснить, что здесь происходит.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...