我正在使用JavaScript和Regex搜索给定文本中的已知电话号码,然后将其替换为其他一些号码。虽然我知道电话号码,但我不确定给定文本中使用的电话号码格式。文本可以是任何语言。
例如,我需要找到电话号码+14101111111并将其替换为以下字符串中的+14102222222:
Call me at +1-(410)-111-1111.
最好我想用新号码替换旧号码,保持与旧号码相同的格式。因此结果字符串应如下所示:
Call me at +1-(410)-222-2222.
我使用以下正则表达式来搜索字符串中的数字。我将电话号码拆分并在每个号码后应用正则表达式。
([&;nbsp_\.\(\)\+\-~\*•–\s]*)
因此,在这种情况下,完整的正则表达式将如下所示:
/1([&;nbsp_\.\(\)\+\-~\*•–\s]*)4([&;nbsp_\.\(\)\+\-~\*•–\s]*)1([&;nbsp_\.\(\)\+\-~\*•–\s]*)0([&;nbsp_\.\(\)\+\-~\*•–\s]*)1([&;nbsp_\.\(\)\+\-~\*•–\s]*)1([&;nbsp_\.\(\)\+\-~\*•–\s]*)1([&;nbsp_\.\(\)\+\-~\*•–\s]*)1([&;nbsp_\.\(\)\+\-~\*•–\s]*)1([&;nbsp_\.\(\)\+\-~\*•–\s]*)1([&;nbsp_\.\(\)\+\-~\*•–\s]*)1/g
这确实匹配了数字,我可以捕获这些组。
我将在网页上使用此方法。
问题: 使用这种方法的注意事项是什么? 你能想到一个更好的方法吗? 多语言网页的效果如何?
谢谢!
答案 0 :(得分:1)
为了维护,我会以编程方式构建你的正则表达式:
var originalNumber = '14101111111';
var potentialDelimiters = '(( |[_\\.\\(\\)\\+\\-~\\*•–\\s])*)';
var regexString = originalNumber.split('').join(potentialDelimiters);
var numberSwapper = new RegExp(regexString);
我的两分钱:听起来你找到了一个解决相当尴尬问题的有效方案;优化有时会比节省更多时间。使用您所拥有的功能运行 - 只需在您需要的情况下保持其可维护性,以便将来进行优化。祝你好运!
答案 1 :(得分:0)
我会避开字符集中的“nbsp”字符,并为此使用单独的匹配,除非您想要捕获“+ 1nnnnnsnssb410111nsns111bnsnsnss1”。
我还考虑将*
更改为更有限的字符数,也许{1,5}
将其更改为(( ?|[_\.\(\)\+\-~\*•–\s]){1,5})
答案 2 :(得分:0)
也许你可以尝试在文本中循环查找中间带有特殊字符的行中的数字,因为你知道你需要检查的数字是否正确,以及它们中间的字符是否正确是通常用于显示电话号码的字符。如果条件为真,您只需替换数字并使用最初使用的特殊字符。
答案 3 :(得分:0)
尝试使用:
string.replace( /\d+(\D?)\d+([^\d)-])/g, '222$1222$2')
答案 4 :(得分:0)
这是我认为你可以做到的一种方式:
function formatNumber(string, number) {
var regExp = /[^\d\s\+]?(\+?\d+)[^\d\s]?/g;
var index = 0;
var stringCopy = string.slice();
var arr;
while(arr = regExp.exec(string)){
var numReplace = arr[1];
var toReplace = number.substr(index, arr[1].length);
index += arr[1].length;
stringCopy = stringCopy.replace(arr[1], toReplace);
}
return stringCopy;
//console.log(stringCopy)
}
function findNumber(number, string){
var regExp = /[^\d\s\+]?(\+?\d+)[^\d\s]?/g;
var index = 0,
arr,
results = '';
while(arr = regExp.exec(string)){
if(index === number.length){
break;
//Found a Possible Match
}
var numFoundLength = arr[1].length;
var numToFind = number.substr(index, numFoundLength);
index += numFoundLength;
if(numToFind == arr[1]){
results += arr[0];
} else {
//Number doesn't follow pattern, reset
index = 0;
}
}
if(index !== number.length) {
return false;
} else {
return results;
}
}
function findAndReplaceNumber(numToFind, numToReplace, string){
var numFound = findNumber(numToFind, string);
var fNum = formatNumber(numFound, numToReplace);
return string.replace(numFound, fNum);
}
document.getElementById('results').innerHTML = 'Test string = "Call me at +1-(410)-111-1111"\n';
document.getElementById('results').innerHTML += 'Replace number: +14101111111 for +1410222222"\n';
document.getElementById('results').innerHTML += findAndReplaceNumber('+14101111111','+14102222222', 'Call me at +1-(410)-111-1111.');

<pre id="results"></pre>
&#13;
它的方式是寻找可以被分隔符包围的数字,并将匹配的数字与其当前索引进行比较。然后它将索引增加匹配数字的长度。我觉得这个功能最丑陋但是做得很好,一个更好的功能可以用一个更好的表达式来寻找具有可能分隔符的确切数字。这也仅在可能有更多时寻找一种格式。 formatNumber做了类似的事情。
应该注意的是,对于不同长度的数字,它可能表现得很奇怪。