Я пытаюсь «выделить» ссылки на законодательные акты в тексте, который я показываю. Эти ссылки имеют вид <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:)
с параметрами .regularExpression
(и nil
locale) для сопоставления. Я вижу, что iOS использует ICU-совместимые регулярные выражения, тогда как эти другие инструменты используют PCRE (я думаю). Но, насколько я могу судить, мое выражение должно быть совместимым и действительным для моего случая с анализом ICU. Но что-то определенно отличается, и я не могу понять, что это такое.
Кто-нибудь? (Я собираюсь попробовать NSRegularExpression
и посмотреть, будет ли он вести себя по-другому, но я все же хотел бы выяснить, что здесь происходит.)