OpenRefine Regex и GREL совпадают с ошибкой
Внутри openRefine
Я хочу запустить приведенное ниже регулярное выражение для источника веб-сайта, который находит адреса электронной почты с mailto
ссылка на сайт. Моя проблема при запуске value.match, я получаю эту ошибку:
Ошибка синтаксического анализа по смещению 12: неправильное регулярное выражение (класс закрытых символов рядом с индексом 10 .* Mailto:[^ ^)
Я проверил выражение в другой среде без value.match, и оно работает.
value.match(/.*mailto:[^/"/']*.com.*/)
2 ответа
isNotNull(value.match(/.*mailto:[^\"\']*.com.*/))
как описано на нашей странице справки для функции match(), она возвращает массив групп захвата в вашем шаблоне RegEx, а затем isNotNull() выводит True или False, если ваше значение похоже на этот шаблон: https://github.com/OpenRefine / OpenRefine / вики / Grel-струнная-функция # MatchString-s-регулярное_выражение-р
Также описано здесь: https://github.com/OpenRefine/OpenRefine/wiki/Understanding-Regular-Expressions
Вы также можете использовать get(), как описано здесь в разделе "Рецепты" на нашей вики, НО будет работать хорошо, только если у вас есть только 1 адрес электронной почты на ячейку (это потому, что функция get() без номера от или до, делает предположения и использует длину массива для определения последнего элемента и выталкивания только последнего элемента, а не первого или третьего и т. д.): https://github.com/OpenRefine/OpenRefine/wiki/Recipes
Например:
get(value.match(/.*(mailto:[^\"\']*.com).*/),0)
Так что если у вас есть текст вроде:
Blah blah <a href="mailto:j.bloggs@example.com">mail me</a>
Чтобы извлечь адрес электронной почты с помощью функции соответствия в OpenRefine, вам нужно использовать:
value.match(/.*mailto:([^\"\']*.com).*/)
Это даст массив, содержащий адрес электронной почты, который захватывается с помощью группы захвата. Чтобы извлечь адрес электронной почты из массива (который необходим, если вы хотите сохранить адрес электронной почты в ячейке OpenRefine), вам нужно получить строковое значение из массива. например:
value.match(/.*mailto:([^\"\']*.com).*/)[0]
Разница между вашим исходным выражением и этим выражением состоит в том, что символы экранированы правильно, и существует группа захвата - в основном реализующая рекомендации @LukStorms в комментариях выше.