Как найти строку CSV и вернуть совпадение с помощью регулярного выражения Javascript

StackOverflow https://stackoverflow.com/questions/1204485

  •  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_".

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top