Regex не соответствует строке в схеме, но работает на другой платформе - PullRequest
2 голосов
/ 15 июня 2019

Я запускаю string-match, используя шаблон [ \[\]a-zA-Z0-9_:.,/-]+, чтобы сопоставить образец текста Text [a,b].Хотя шаблон работает на regex101, когда я запускаю его по схеме, он возвращает #f.Вот ссылка regex101 .

Это функция, которую я запускаю

(string-match "[ \\[\\]a-zA-Z0-9_:.,/-]+" "Text [a,b]")

Почему это не работает на схеме, но работаетeleswhere?Я что-то упустил?

Ответы [ 2 ]

2 голосов
/ 15 июня 2019

Я не вижу ничего плохого в вашем синтаксисе регулярных выражений, так как он указан в кавычках, поэтому я предполагаю, что должна быть ошибка в Guile или в используемой им библиотеке регулярных выражений, где \] просто неверно интерпретируетсявнутренние скобки.Я нашел обходной путь, используя вместо этого значения восьмеричного кода:

(string-match "[A-Za-z\\[\\0135]+" "Text [a,b]")
; ==> #("Text [a,b]" (0 . 4))

Ваше регулярное выражение не очень хорошо.Он соответствует любой комбинации этих символов, поэтому "]/Te,3.xt[2" также соответствует.Если вы ожидаете строку типа «Что-то [что-то, что-то]», я бы предпочел сделать / [AZ] [a-z0-9] + [[a-z0-9] +, [a-z0-9] +] / вместо.например.

(define pattern "[A-Z][a-z0-9]+ \\[[a-z0-9]+,[a-z0-9]+\\]") 
(string-match pattern "Test [q,w]")     ; ==> #("Test [q,w]" (0 . 10))
(string-match pattern "Be100 [sub,45]") ; ==> #("Be100 [sub,45]" (0 . 14))
1 голос
/ 18 июня 2019

После обсуждения проблемы в списке рассылки guile gnu я обнаружил, что библиотека Guile (ice-9 regex) использует расширенные регулярные выражения POSIX. И этот вариант регулярного выражения не поддерживает экранирование в классах символов [..], поэтому он не соответствует строкам.

Однако я использовал следующую функцию в качестве обходного пути, и она работает:

(string-match "[][a-zA-Z]+" "Text[ab]")

...