我试图看看是否可以用简单的JavaScript实现这一点。
假设我有一个字符串:
var ourstring = "Blah TEST ('1') TEST('2') Blah BLah TEST ( '1' ) TEST( '2' )";
请注意在字符串中写入不同的TEST('1')
。
我们如何检测字符串中的所有TEST('')
,无论它写的有多么不同,并根据括号的包含用其他内容替换它们。
所以TEST ('1')
改为TEST('1.node')
。这是可能的,如果是,请告诉我并逐步解释,以便我可以从中学习。
我已经搜索过这样的解决方案,但找不到任何东西。问题我不知道该怎么做。请告诉我。
答案 0 :(得分:2)
使用正则表达式:
let str = "TEST ('1') TEST('2') Blah BLah TEST ( '1' ) TEST( '2' )";
const re = /TEST\s*\(\s*'([\d]*?)'\s*\)/g;
str = str.replace(re, "TEST('$1.node')");
console.log(str)
/* str becomes:
"TEST('1.node') TEST('2.node') Blah BLah TEST('1.node') TEST('2.node')"
*/
逐步打破正则表达式:
TEST
与文字完全匹配\s?
表示可选的空格; \s
表示任何空白字符,?
表示可选\(
匹配括号;它必须被转义,因为(
与正则表达式中的分组相关([\d]*)
匹配[]
之间的字符(在这种情况下只是数字,\d
)0次。由于它在()
之间,因此该值将被选为匹配组,并在替换字符串中以$1
形式提供g
最后是贪婪的,意味着在给定的字符串中尽可能多地匹配根据您的目标,您希望在空格后用?
替换可选(*
)以表示0多个空白字符。
答案 1 :(得分:1)
此正则表达式/(TEST)\s*\((\s*)'([\d]?)'(\s*)\)/g
捕获了五个组:
(
'
与内部号码之间的空格。'
与最后)
之间的空格。使用这五个组,您可以构建精确的结构+单词node
。
var ourstring = "Blah TEST ('1') TEST('2') Blah BLah TEST ( '1' ) TEST( '2' )";
console.log(ourstring.replace(/(TEST)(\s*)\((\s*)'([\d])'(\s*)\)/g, "$1$2($3'$4.node'$5)"))
.as-console-wrapper { max-height: 100% !important; top: 0; }
此方法用于检查捕获的组以决定要替换的所需值。
var ourstring = "Blah TEST ('1') TEST('2') Blah BLah TEST ( '1' ) TEST( '2' )";
console.log(ourstring.replace(/'([\d])'/g, function(match, group) {
if (group === '1') {
return `'${group}.nodeOne'`;
}
if (group === '2') {
return `'${group}.nodeTwo'`;
}
}))
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 2 :(得分:0)
您正在寻找的是正则表达式替换。您需要编写一个与您要更改的文本匹配的正则表达式,然后将其与String.replace
一起使用。
var newString = ourString.replace(/(TEST\('\d+)('\))/gi, function(match, group1, group2) {
return group1+'.node'+group2;
});
其中重要的部分是正则表达式: (TEST( '\ d +)('))
这匹配TEST后跟括号,引号和一个或多个数字,然后结束引号和括号。
它将第一部分(例如TEST('1
)放入捕获组,然后对第二部分(')
)执行相同操作。
这些应最终包含在group1
和group2
个变量中。
然后功能就是将这些功能再次拼接在一起,并在中间加上.node
。
修改强>
你可以捕获数字,然后根据它确定要返回的内容:
var newString = ourString.replace(/TEST\('(\d+)'\)/gi, function(match, num) {
if(num == '1')
return "TEST('1.node')";
else
return "TEST('1.otherThing')";
});
在正则表达式中要注意的是,文字括号与字符串\(
中的内容匹配,并且有捕获组(未转义的括号)。