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 в комментариях выше.

Другие вопросы по тегам