RegEx для сопоставления цифр и сбоя специальных символов - PullRequest
1 голос
/ 14 мая 2019

Мое регулярное выражение ниже соответствует всему с этим символом после цифр.Я хочу иметь возможность сопоставления, только если присутствует , но нет, если за ним следует или

\(\d{1,}(?:\,?\d{3})*(?:\.\d+)?[ ]?)(!千伏|!千吨|千)\

В настоящее время:

220千伏 (match '220千')
220千吨 (match '220千')
220千 (match '220千')

Ожидается:

220千伏 (no match)
220千吨 (no match)
220千 (match '220千')

Ответы [ 2 ]

2 голосов
/ 14 мая 2019

Я предполагаю, что вы можете захотеть иметь список, чтобы исключить определенные вещи и иметь другие определенные символы, возможно, что-то похожее на:

\d{1,}(?:\,?\d{3})*(?!千伏|千吨)(?:千)

RegEx

Вы можете создавать / изменять/ изменить ваши выражения в regex101.com .

enter image description here

Схема RegEx

Вы можете визуализировать свои выражения в jex.im :

enter image description here

Тест JavaScript

const regex = /\d{1,}(?:\,?\d{3})*(?!千伏|千吨)(?:千)/gm;
const str = `220千伏
220千吨
220千`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}

Кроме того, вы, возможно, не захотите избегать неметачаров, как советовал Barmar , которые вы можете изменить в этой части своего выражения:

\d{1,}(?:\,?\d{3})*
1 голос
/ 14 мая 2019

См. Ниже рабочую версию регулярного выражения.

Основная идея заключается в использовании 千(?![伏吨]), который является литералом , за которым следует отрицательное прогнозное утверждение (а [ ], как обычно, просто класс символов). Он соответствует 千, но только если за ним не следует 伏 или 吨.

(Я также удалил лишние скобки, изменил {1,} на + и привязал совпадение к началу строки. Если вы не хотите этого, рассмотрите хотя бы использование \b (word граница) якорь в начале.)

const inputs = [
  '220千伏',
  '220千吨',
  '220千',
];

for (const str of inputs) {
  console.log(
    str + (
      /^\d+(?:,\d{3})*(?:\.\d+)?[ ]?千(?![伏吨])/.test(str)
        ? ' (match)'
        : ' (no match)'
    )
  );
}
...