Как найти строку CSV и вернуть совпадение с помощью регулярного выражения Javascript
-
05-07-2019 - |
Вопрос
Я пытаюсь извлечь первое пользовательское право из строки, разделенной точкой с запятой, которая соответствует шаблону.
Права пользователей хранятся в формате: <Код> LAA; LA_1; LA_2; LE_3; код> р>
Строка пуста, если у пользователя нет прав.
Мое лучшее решение на данный момент - использовать следующее выражение в выражении regex.replace: . <Код> * ?; (LA _ [^;] *)?. * Код>
(Вопросительный знак в конце группы предназначен для сопоставления всей строки в случае, если у пользователя нет прав, и замените его пустой строкой, чтобы указать, что у него его нет.)
Однако, это не работает правильно, если искомое право находится на первой позиции: <Код> LA_1; LA_2; LE_3; код> р>
Это легко исправить, просто добавив точку с запятой в начале строки перед заменой регулярного выражения, но мой вопрос: почему следующее регулярное выражение не соответствует этому?
<код> * ((:? ^ |;) (LA _ [^;] *)).?. * Код>
Я пробовал множество других регулярных выражений, чтобы найти решение, но пока безуспешно.
Решение
Я не уверен, что правильно понял ваш вопрос, но в отношении используемых вами регулярных выражений вы слишком усложняете их без какой-либо явной причины (по крайней мере, для меня). Вы можете захотеть что-то вроде:
function getFirstRight(rights) {
var m = rights.match(/(^|;)(LA_[^;]*)/)
return m ? m[2] : "";
}
Другие советы
Сначала вы можете просто разбить строку:
function getFirstRight(rights)
{
return rights.split(";",1)[0] || "";
}
Чтобы ответить на конкретный вопрос " почему следующее регулярное выражение не соответствует ему? " ;, одной из проблем является сочетание этого в начале:
.*?
в итоге следует:
^|;
Что может быть похоже на поговорку: пропускайте лишние символы, пока не дойдете до начала или до точки с запятой. Но вы не можете пропустить что-либо, а затем позже придете к началу (если только это не связано с переводом строки в многострочную строку).
Примерно так работает:
.*?(\bLA_[^;]).*
То есть пропустить символы до границы слова, за которой следует "LA_".