Google sheet : REGEXREPLACE 匹配除特定模式之外的所有内容
Google sheet : REGEXREPLACE match everything except a particular pattern
我会尝试替换此字符串中的所有内容:
[JGMORGAN - BANK2] n° 10 NEWYORK, n° 222 CAEN, MONTELLIER, VANNES / TARARTA TIs
1303222074, 1403281851 & 1307239335 et Cloture TIs 1403277567,
1410315029
以下号码除外:
1303222074
1403281851
1307239335
1403277567
1410315029
我已经构建了一个正则表达式来匹配它们:
1[0-9]{9}
但我还没有想出相反的方法,即除了所有匹配项之外的所有内容...
google 电子表格使用 Re2 正则表达式引擎,并且不支持许多可以帮助您执行此操作的有用功能。因此,一个基本的解决方法可以帮助您:
首先匹配你要保留的内容并捕获它:
模式:[0-9]*(?:[0-9]{0,9}[^0-9]+)*(?:([0-9]{9,})|[0-9]*\z)
替换:</code><em>(后面有一个space)</em></p>
<p><a href="https://regex101.com/r/gB7dO3/1" rel="nofollow">demo</a></p>
<p>所以可能是这样的:</p>
<pre><code>=TRIM(REGEXREPLACE("[JGMORGAN - BANK2] n° 10 NEWYORK, n° 222 CAEN, MONTELLIER, VANNES / TARARTA TIs 1303222074, 1403281851 & 1307239335 et Cloture TIs 1403277567, 1410315029"; "[0-9]*(?:[0-9]{0,9}[^0-9]+)*(?:([0-9]{9,})|[0-9]*\z)"; " "))
首先感谢Casimir 的帮助。它给了我一个想法,使用内置函数和强大的正则表达式大声笑是不可能的。
我发现我可以为自己的目的制作一个自制函数(是的,我不是很“最新”)。
它的编码不是很好,它 returns doublons。但是我没有正确修复它,而是在 if 之上使用内置的 UNIQUE()
函数来摆脱它们;它很丑,我很懒,但它完成了工作,即特定正则表达式的所有匹配列表(即:1[0-9]{9}
)。这是:
function ti_extract(input) {
var tab_tis = new Array();
var tab_strings = new Array();
tab_tis.push(input.match(/1[0-9]{9}/)); // get the TI and insert in tab_tis
var string_modif = input.replace(tab_tis[0], " "); // modify source string (remove everything except the TI)
tab_strings.push(string_modif); // insert this new string in the table
var v = 0;
var patt = new RegExp(/1[0-9]{9}/);
var fin = patt.test(tab_strings[v]);
var first_string = tab_strings[v];
do {
first_string = tab_strings[v]; // string 0, or the string with the first removed TI
tab_tis.push(first_string.match(/1[0-9]{9}/)); // analyze the string and get the new TI to put it in the table
var string_modif2 = first_string.replace(tab_tis[v], " "); // modify the string again to remove the new TI from the old string
tab_strings.push(string_modif2);
v += 1;
}
while(v < 15)
return tab_tis;
}
您也可以使用动态本机函数执行此操作:
=REGEXEXTRACT(A1,rept("(\d{10}).*",counta(split(regexreplace(A1,"\d{10}","@"),"@"))-1))
基本上它首先被所需的字符串拆分,以确定它出现了多少次,然后重复正则表达式以动态创建该数量的捕获组,从而最终只留下这些值。
我会尝试替换此字符串中的所有内容:
[JGMORGAN - BANK2] n° 10 NEWYORK, n° 222 CAEN, MONTELLIER, VANNES / TARARTA TIs 1303222074, 1403281851 & 1307239335 et Cloture TIs 1403277567, 1410315029
以下号码除外: 1303222074 1403281851 1307239335 1403277567 1410315029
我已经构建了一个正则表达式来匹配它们:
1[0-9]{9}
但我还没有想出相反的方法,即除了所有匹配项之外的所有内容...
google 电子表格使用 Re2 正则表达式引擎,并且不支持许多可以帮助您执行此操作的有用功能。因此,一个基本的解决方法可以帮助您:
首先匹配你要保留的内容并捕获它:
模式:[0-9]*(?:[0-9]{0,9}[^0-9]+)*(?:([0-9]{9,})|[0-9]*\z)
替换:</code><em>(后面有一个space)</em></p>
<p><a href="https://regex101.com/r/gB7dO3/1" rel="nofollow">demo</a></p>
<p>所以可能是这样的:</p>
<pre><code>=TRIM(REGEXREPLACE("[JGMORGAN - BANK2] n° 10 NEWYORK, n° 222 CAEN, MONTELLIER, VANNES / TARARTA TIs 1303222074, 1403281851 & 1307239335 et Cloture TIs 1403277567, 1410315029"; "[0-9]*(?:[0-9]{0,9}[^0-9]+)*(?:([0-9]{9,})|[0-9]*\z)"; " "))
首先感谢Casimir 的帮助。它给了我一个想法,使用内置函数和强大的正则表达式大声笑是不可能的。
我发现我可以为自己的目的制作一个自制函数(是的,我不是很“最新”)。
它的编码不是很好,它 returns doublons。但是我没有正确修复它,而是在 if 之上使用内置的 UNIQUE()
函数来摆脱它们;它很丑,我很懒,但它完成了工作,即特定正则表达式的所有匹配列表(即:1[0-9]{9}
)。这是:
function ti_extract(input) {
var tab_tis = new Array();
var tab_strings = new Array();
tab_tis.push(input.match(/1[0-9]{9}/)); // get the TI and insert in tab_tis
var string_modif = input.replace(tab_tis[0], " "); // modify source string (remove everything except the TI)
tab_strings.push(string_modif); // insert this new string in the table
var v = 0;
var patt = new RegExp(/1[0-9]{9}/);
var fin = patt.test(tab_strings[v]);
var first_string = tab_strings[v];
do {
first_string = tab_strings[v]; // string 0, or the string with the first removed TI
tab_tis.push(first_string.match(/1[0-9]{9}/)); // analyze the string and get the new TI to put it in the table
var string_modif2 = first_string.replace(tab_tis[v], " "); // modify the string again to remove the new TI from the old string
tab_strings.push(string_modif2);
v += 1;
}
while(v < 15)
return tab_tis;
}
您也可以使用动态本机函数执行此操作:
=REGEXEXTRACT(A1,rept("(\d{10}).*",counta(split(regexreplace(A1,"\d{10}","@"),"@"))-1))
基本上它首先被所需的字符串拆分,以确定它出现了多少次,然后重复正则表达式以动态创建该数量的捕获组,从而最终只留下这些值。