Регулярное выражение соответствует цифрам перед 2 символами, используя ИЛИ листы Google

Я использую REGEXEXTRACT в Google Таблицах, которые используют RE2 RegEx.

Я хочу получить цифры в строке, которые встречаются либо перед символом P, либо перед символами MC.

вот что у меня есть на данный момент: (\.?\d*).?MC это работает, если мой текст похож на "FM.3 MC1". В Google Таблицах это так:

=REGEXEXTRACT(A1,"(\.?\d*).?MC") 

Это работает для получения цифр до MC, я хочу добавить OR P вот так:

(\.?\d*).?MC|P 

Это возвращает .3, если мой текст «FM.3 MC1», но пустой, если мой текст «FM.3 MC1 P2» или «FM.3 P1», и возвращает #N/A, если мой текст «FM.3».

Также, если мое регулярное выражение (\.?\d*).?P|MC, оно возвращает .3, если мой текст «FM.3 P1» пуст, если мой текст «FM.3 MC P1»

Я не уверен, что это RegEx или Google Таблицы странные.

Ищу советы.


person J nui    schedule 06.03.2018    source источник


Ответы (3)


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

(\.?\d*)\W?(?:MC|P)

Я заменил .? (= любые символы 1 или 0) на \W, поскольку я думаю, что между числом и буквами может быть только символ, не являющийся словом.

См. демонстрацию регулярных выражений.

Подробности

  • (\.?\d*) - Группа 1 (что возвращает REGEXEXTRACT): необязательный ., за которым следует 0 или более цифр (измените на (\.?\d+), чтобы соответствовать 1 или более цифрам)
  • \W? - необязательный символ, не являющийся словом
  • (?:MC|P) - группа без захвата (таким образом, она не возвращается с REGEXEXTRACT) либо подстрокой MC, либо P символом.
person Wiktor Stribiżew    schedule 06.03.2018
comment
спасибо, также спасибо за regex101, я не знал об этом инструменте - person J nui; 07.03.2018

НЕПРОВЕРЯЕМЫЕ (меня не беспокоит создание разумной выборки данных из выбранного вами формата):

=join("",REGEXEXTRACT(A1,"(.?\d*).?MC|(.?\d*).P"))
person pnuts    schedule 06.03.2018

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

var input = [
  "FM.3 MC1",
  "FM.3 MC1 P2",
  "FM.3",
  "FM.3 P2"
];
var patterns = [
  /(.?\d*).?MC|P/g,
  /(.?\d*).?(MC|P)/g
];
for (let p = 0; p < patterns.length; ++p) {
  console.log("Using pattern '" + String(patterns[p]) + "':");
  for (let i = 0; i < input.length; ++i) {
    console.log("\tFrom '" + input[i] + "', found " + (input[i].match(patterns[p]) || "(no matches)"));
  }
}

Вы можете вживую увидеть совпадения регулярных выражений с помощью таких инструментов, как regextester или regex101, среди других.

person tehhowch    schedule 06.03.2018
comment
спасибо за этот ответ, у меня это не совсем сработало в таблицах Google - person J nui; 07.03.2018