Regex запятая как необязательный символ - PullRequest
2 голосов
/ 29 февраля 2020

У меня есть это регулярное выражение:

/\$([A-Za-z0-9\-\_ ]+)(\,?)/gi

Мне нужно преобразовать следующие выражения:

$a, $b, $c, $hi = "", $na

В это:

$a = NULL, $b = NULL, $c = NULL, $hi = "", $na = NULL

Но Я получаю это вместо примера выше:

$a = NULL, $b = NULL, $c = NULL, $hi = "", $na

Я использую это для замены значений:

$$$1 = NULL$2

Как вы можете видеть, если нет запятой, это не сработает.

Надеюсь, что вы, ребята, можете мне помочь.

Обновление: Мне просто нужно игнорировать его, если оно имеет "=" и значение: Для Например, я должен преобразовать это:

$a, $a, $a
$a, $a = '', $a
$a
$a,
$a = ''
$a = '',
$a = '', $a

В это

$a = NULL, $a = NULL, $a = NULL
$a = NULL, $a = '', $a = NULL
$a = NULL
$a = NULL,
$a = ''
$a = '',
$a = '', $a = NULL

'' также может быть NULL, "" и целочисленными значениями.

Ответы [ 3 ]

1 голос
/ 01 марта 2020

Вы можете использовать

/\$([\w -]+)(?!\w|,?\s*=)(,?)/g

См. Демоверсию regex .

Обратите внимание, что [A-Za-z0-9_] = \w, таким образом, шаблон регулярного выражения можно сократить как показано выше.

Часть (?!\w|,?\s*=) является здесь основным отличием: она гарантирует, что нет слова char или необязательного ,, за которым следуют 0+ пробелов и затем = сразу после сопоставления с Группой 1 pattern, [\w -]+.

См. демоверсию JS:

const texts = ['$a, $a, $a', "$a, $a = '', $a", '$a', '$a,', "$a = ''", "$a = '',", "$a = '', $a", '$a, $b, $c, $hi = "", $na'];
const regex = /\$([\w -]+)(?!\w|,?\s*=)(,?)/g;
for (let s of texts) {
  console.log("`" + s + "` => `" + s.replace(regex, '$1 = NULL$2') + "`")
}
0 голосов
/ 29 февраля 2020

Поскольку желаемый результат для строки из семи строк, приведенной в вопросе, является просто литералом, вам не нужен код; просто запишите это. Однако я подозреваю, что это всего лишь пример более широкого, неустановленного вопроса. Как мы можем догадаться, что это за вопрос из одного примера? Я сделаю предположение, но это только предположение. Вам нужно отредактировать свой вопрос, чтобы сформулировать вопрос, для которого вы дали пример. Мои предположения следующие.

Подстроки для изменения начинаются со знака доллара, за которым следуют одна или несколько строчных букв, за которыми следует запятая или конец строки в строке.

I sh для замены каждой подстроки, подлежащей изменению, "$xx" на "$xx = NULL", где "xx" обозначает любую строку из одной или нескольких строчных букв.

Подстроки, которые нужно изменить, могут быть идентифицированы с помощью регулярного выражения

/\$[a-z]+(?=,|$)/

, где (?=,|$) - это положительный прогноз, который требует, чтобы после совпадения следовала запятая или конец строки ($) в string.

Обратите внимание, как это регулярное выражение легко следует из точной постановки вопроса.

Я не знаю Javascript, но в Ruby подстановка может быть выполнена следующим образом. Если str является заданной (возможно, многострочной) строкой, желаемую строку можно получить следующим образом:

str.gsub(/\$[a-z]+(?=,|$)/) { |s| "#{s} = NULL" } 

Я подтвердил, что это приводит к желаемому результату для примера строки из семи строк в вопросе .

Полагаю, это можно легко перевести на Javascript.

0 голосов
/ 29 февраля 2020

Обновление 2

На самом деле вы можете использовать мое оригинальное регулярное выражение, если вы отредактируете его , используя соответствующие флаги:

/(?<=\$[A-Za-z0-9\-\_ ]+)(?=(?:,|$))/gmi

флаг m здесь сообщая $, что соответствует не только абсолютный конец входной строки (который является EOL последней строки), но также конец каждой строки, который я мог сопоставить с \n в предыдущем обновлении, где я сделал не использовать флаг m. (Метасимвол ^ аналогичен.)

Обновление

С тех пор, как через некоторое время вы пришли с новостями (которые я должен был ожидать, так что это моя вина), что входной файл многострочный, вам нужен следующий вариант, который ожидает одну из трех возможных вещей, , и $, как в моем исходном ответе, а также \n, который является EOL, для всех строки, но последние:

/(?<=\$[A-Za-z0-9\-\_ ]+)(?=(?:,|\n|$))/gi

Исходный ответ

Вы можете использовать следующее регулярное выражение для определения позиций, в которые вы хотите вставить = NULL:

/(?<=\$[A-Za-z0-9\-\_ ]+)(?=(?:,|$))/gi

Поскольку я использовал lookbehind и lookahead, чтобы найти позицию, все регулярное выражение фактически не соответствует ни одному тексту, а только позиции, так что вам не нужно ссылаться на что-либо в подстановке, которая должна быть только = NULL. Вы можете увидеть это в действии здесь .

Подробнее

  • (?<=regex) соответствует позиции (совпадение нулевой длины) в конце текст соответствует regex, поэтому в конкретном примере c он совпадает сразу после $a, $b, ...
  • (?=regex) в позиции в начале соответствующего текста на regex, поэтому в конкретном примере c он совпадает непосредственно перед , или $ (EOL), которые являются двумя альтернативами, разделенными |.
  • (?:…) просто версия без захвата (…).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...