Совпадение слов после игнорирования слов, содержащих символы - PullRequest
1 голос
/ 20 мая 2019

Я ищу соответствие всему прошедшему, но игнорирую слова, содержащие ().

Пример:

Планшет-MS Surface Pro 4 - Рикардо Кортез (OFFSITE)

Как я могу получить только Ricardo Cortez?

Вот что я попробовал:

/[^-]+(?![(][)])+$/g

Спасибо

Ответы [ 3 ]

0 голосов
/ 20 мая 2019

Вы можете использовать чередование , чтобы сначала сопоставить то, что вы не хотите, и захватить в группе то, что вы хотите.

Этот шаблон не требует, чтобы дефис находился в строке на основе вашего шаблона, где вы используете отрицательный символьный класс [^-]+, чтобы не соответствовать дефису, но на самом деле не соответствует ему как обязательному символу.

^.*-|(?:^|[ \t]+)([^\s()]+)(?!\S)

Пояснение

  • ^ Начало строки
  • .*- Соответствует любому символу 0+ раз, а затем -поэтому он будет соответствовать последнему дефису
  • | или
  • (?:^|[ \t]+) Утверждать начало строки или совпадать с 1+ пробелом или табуляцией
  • ([^\s()]+)Захват в группе 1, соответствующий + times not a whitespace char or (or) `
  • (?!\S) Отрицательный взгляд вперед, утверждаем, что справа не является символом без пробела

Regex demo

Edit

Если вы хотите использовать замену, вы можете сопоставить все, что вы не хотите сохранять, и заменить на пустую строку:

^.*-\s*|\s*\S*[()]+\S*

Объяснение

  • ^.*-\s* Соответствует любой единице символов последнему дефису, за которым следует 0+ пробельных символов
  • | Или
  • \s* Совпадение 0+ раз с пробелами
  • \S*[()]+\S* Совпадение 0+ раз с непробельным символом, но не с ( или ) 1+ раз и снова 0+ раз непробельный символ

Regex demo

Например

$string = "Tablet - MS Surface Pro 4 - Ricardo Cortez (OFFSITE)"
$name = $string -replace '^.*-|\S*[()]+\S*','' 
echo $name
0 голосов
/ 20 мая 2019

Я предполагаю, что вы хотите удалить имя. Если это так, мы хотим захватить его, затем заменить его с помощью групп захвата Возможно выражение, похожее на:

(.+?-\s)([A-Z].+)(\(.+)

enter image description here

Демо

const regex = /(.+?-\s)([A-Z].+)(\(.+)/gm;
const str = `Tablet-MS Surface Pro 4 - Ricardo Cortez (OFFSITE)`;
const subst = `$1$3`;

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

console.log('Substitution result: ', result);

Если мы захотим удалить () и все, что в нем есть, мы можем пролистать все символы в первой группе захвата, затем перехватить нежелательные, а затем заменить на $1:

([\s\S].*?)(\(.+?\))?

const regex = /([\s\S].*?)(\(.+?\))?/gm;
const str = `Tablet-MS Surface Pro 4 - Ricardo Cortez (OFFSITE)Tablet-MS Surface Pro 4 - Ricardo Cortez (OFFSITE)Tablet-MS Surface Pro 4 - Ricardo Cortez (OFFSITE)Tablet-MS Surface Pro 4 - Ricardo Cortez (OFFSITE)Tablet-MS Surface Pro 4 - Ricardo Cortez`;
const subst = `$1`;

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

console.log('Substitution result: ', result);

Демо

enter image description here

RegEx Circuit

jex.im также помогает визуализировать выражения.

enter image description here

0 голосов
/ 20 мая 2019

Не зная, как вы используете это регулярное выражение, я бы предложил что-то вроде этого:

/ - ([^\(]+) /g

, который стремится захватить все в скобках. По сути, найдите совпадение, начинающееся с дефиса, а затем перехватывайте все, пока оно не попадет в открывающую скобку (т. Е. Любой символ, который не является открывающей скобкой).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...