我在使用RE2正则表达式的google工作表中使用regexextract
我希望在字符“P”之前或字符“MC”之前的字符串中获取数字
这是我到目前为止(。?\ d *)。?MC如果我的文字像“FM.3 MC1”(在谷歌表中它就像这样= REGEXEXTRACT(A1,“(。?\ d) *)?MC“)
这适用于在MC之前获取数字,我想像这样添加OR P(。?\ d *)。?MC | P.
如果我的文本是“FM.3 MC1”,则返回.3,如果我的文本是“FM.3 MC1 P2”或“FM.3 P1”,则返回空白,如果我的文本是“FM.3”,则返回#N / A.
另外,如果我的正则表达式是(。?\ d *)。?P | MC,那么......如果我的文本是“FM.3 P1”,则返回.3如果我的文本是“FM.3 MC P1”则为空白
我不确定这是否是正则表达式,或者谷歌表是否很奇怪。
我正在寻找小费...谢谢
你可以用
(\.?\d*)\W?(?:MC|P)
我用.?
替换了\W
(=任何1或0个字符),因为我认为数字和字母之间只能有一个非单词字符。
细节
(\.?\d*)
- 第1组(REGEXEXTRACT
返回的内容):可选的.
后跟0位或更多位数(更改为(\.?\d+)
以匹配1位或更多位数)\W?
- 一个可选的非单词char(?:MC|P)
- 一个非捕获组(因此,它不与REGEXEXTRACT
一起返回)或MC
子串或P
char。UNTESTED(我不能打算从您选择的格式构建合理的数据样本):
=join("",REGEXEXTRACT(A1,"(.?\d*).?MC|(.?\d*).P"))
要对两个结束条件进行分组,您需要将它们括在括号中。
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等工具实时查看正则表达式匹配。