首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从数组中调用regex替换?

如何从数组中调用regex替换?
EN

Stack Overflow用户
提问于 2018-12-05 16:13:47
回答 2查看 54关注 0票数 2

我正在尝试对字符串执行一些替换操作。替换操作存储在数组中。一切进展顺利,直到第三幕。我不能让那个人工作,也不明白为什么。它没有给出错误,只是没有执行最后一次替换"/(\d{1,5})/([A-Z]{3})/g","$2/$1"

第一个替换用斜杠替换所有空格,第二个替换从右边的字符串向下移动(插入新行),第三个替换应该用前面的4位数字交换ESB字符串。

例如

AR/PAG30079XZ/2213/ESB/ABC就会变成AR/PAG30079XZ/ESB/2213/ABC

最后一个部分不起作用

到目前为止,我得到的是:

代码语言:javascript
复制
function autoPlay(){
	var arr = [
				["/ +/g","/"],
				["/(?=[A-Z]R/)/g","$&\n"],
				["/(\d{1,5})/([A-Z]{3})/g","$2/$1"]
				];
	var arrL = arr.length;
	var str = document.getElementById('val');
	for (var i = 0; i < arrL; i++) {	
		var parts = /\/(.*)\/(.*)/.exec(arr[i][0]);
		var restoredRegex = new RegExp(parts[1], parts[2]);
		var result = str.innerHTML.replace(restoredRegex, arr[i][1]);
		str.innerHTML = result
	}
}
代码语言:javascript
复制
#val{
  border: 1px solid grey;
  padding: 5px;
  height: 300px;
  width: 500px;
  overflow: auto;
}
代码语言:javascript
复制
<button type="button" onClick="autoPlay()">
GO
</button>
<pre id="val" contenteditable="true" spellcheck="false">
AL PAG31503XZ 2351 ESB ABC  AR PAG30079XZ 2213 ESB ABC
BL PMC16410R7 1798 ESB ABC  BR PMC27936XZ 2444 ESB ABC
CL PMC27377XZ 2563 ESB ABC  CR PMC21402XZ 2622 ESB ABC
DL PMC24300XZ 2404 ESB ABC  DR PMC26742XZ 2446 ESB ABC 
EL PMC23546XZ 2682 ESB ABC  ER PMC27450XZ 2774 ESB ABC
FL PMC22126C6 3022 ESB ABC  FR PMC21220XZ 3292 ESB ABC
GL PMC21077XZ 2982 ESB ABC  GR PMC28748XZ 2998 ESB ABC
HL PMC26051XZ 2492 ESB ABC  HR PMC53510R7 2928 ESB ABC
JL PMC24177XZ 3014 ESB ABC  JR PMC21444XZ 2873 ESB ABC
KL PMC24466XZ 2781 ESB ABC  KR PMC21778XZ 2513 ESB ABC
LL PMC22897XZ 2454 ESB ABC  LR PMC26473XZ 2778 ESB ABC
ML PMC27854XZ 2824 ESB ABC  MR PMC26001XZ 3218 ESB ABC
PL PAJ1129 XZ 2279 ESB ABC  PR PAJ51477XZ 2398 ESB ABC
RC PMC58993R7 2176 ESB ABC    
LOWER DECK
FWD
11P PMC28357XZ 1122 ESB ABC
12P PMC24753XZ 1589 ESB ABC
13P PMC26671XZ 1862 ESB ABC 
21P PMC28016XZ 3386 ESB ABC
</pre>

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-05 17:44:18

问题是,你在第三次审判中的\n \d无法逃脱。看一看:

代码语言:javascript
复制
function autoPlay(){
    var arr = [
	["/ +/g","/"],
	["/(?=[A-Z]R/)/g","$&\n"],
	["/(\\d{1,5})/([A-Z]{3})/g","$2\/$1"]
    ];
    var arrL = arr.length;
    var str = document.getElementById('val');
    for (var i = 0; i < arrL; i++) {	
	var parts = /\/(.*)\/(.*)/.exec(arr[i][0]);
     	var restoredRegex = new RegExp(parts[1], parts[2]);    
	var result = str.innerHTML.replace(restoredRegex, arr[i][1]);
	str.innerHTML = result
    }
}
代码语言:javascript
复制
#val{
  border: 1px solid grey;
  padding: 5px;
  height: 300px;
  width: 500px;
  overflow: auto;
}
代码语言:javascript
复制
<button type="button" onClick="autoPlay()">
GO
</button>
<pre id="val" contenteditable="true" spellcheck="false">
AL PAG31503XZ 2351 ESB ABC  AR PAG30079XZ 2213 ESB ABC
BL PMC16410R7 1798 ESB ABC  BR PMC27936XZ 2444 ESB ABC
CL PMC27377XZ 2563 ESB ABC  CR PMC21402XZ 2622 ESB ABC
DL PMC24300XZ 2404 ESB ABC  DR PMC26742XZ 2446 ESB ABC 
EL PMC23546XZ 2682 ESB ABC  ER PMC27450XZ 2774 ESB ABC
FL PMC22126C6 3022 ESB ABC  FR PMC21220XZ 3292 ESB ABC
GL PMC21077XZ 2982 ESB ABC  GR PMC28748XZ 2998 ESB ABC
HL PMC26051XZ 2492 ESB ABC  HR PMC53510R7 2928 ESB ABC
JL PMC24177XZ 3014 ESB ABC  JR PMC21444XZ 2873 ESB ABC
KL PMC24466XZ 2781 ESB ABC  KR PMC21778XZ 2513 ESB ABC
LL PMC22897XZ 2454 ESB ABC  LR PMC26473XZ 2778 ESB ABC
ML PMC27854XZ 2824 ESB ABC  MR PMC26001XZ 3218 ESB ABC
PL PAJ1129 XZ 2279 ESB ABC  PR PAJ51477XZ 2398 ESB ABC
RC PMC58993R7 2176 ESB ABC    
LOWER DECK
FWD
11P PMC28357XZ 1122 ESB ABC
12P PMC24753XZ 1589 ESB ABC
13P PMC26671XZ 1862 ESB ABC 
21P PMC28016XZ 3386 ESB ABC
</pre>

如果您试图在这一行之后执行控制台日志:

代码语言:javascript
复制
var parts = /\/(.*)\/(.*)/.exec(arr[i][0]);

您将在第三次传递中看到返回的部分是:"(d{1,5})/([A-Z]{3})""g"

更好的是,如果您做了一个简单的console.log("/(\d{1,5})/([A-Z]{3})/g"),您将得到答案:"/(d{1,5})/([A-Z]{3})/g"

这是因为在使用第一个正则表达式处理\d之前,js在字符串级别将\d视为一个转义字符。所以只要重新逃离\d (\d),你就完蛋了。

这个代码的一个更好的版本是:

代码语言:javascript
复制
function autoPlay(){
    var arr = [
	["/ +/g","/"],
	["/(?=[A-Z]R/)/g","$&\n"],
	["/(\\d{1,5})/([A-Z]{3})/g","$2\/$1"]
    ];
    var str = document.getElementById('val');
    arr.map((re)=>{
        var parts = /\/(.*)\/(.*)/.exec(re[0]);
        str.innerHTML = str.innerHTML.replace( 
            new RegExp(parts[1], parts[2]), 
            re[1]);
    })
}
代码语言:javascript
复制
#val{
  border: 1px solid grey;
  padding: 5px;
  height: 300px;
  width: 500px;
  overflow: auto;
}
代码语言:javascript
复制
<button type="button" onClick="autoPlay()">
GO
</button>
<pre id="val" contenteditable="true" spellcheck="false">
AL PAG31503XZ 2351 ESB ABC  AR PAG30079XZ 2213 ESB ABC
BL PMC16410R7 1798 ESB ABC  BR PMC27936XZ 2444 ESB ABC
CL PMC27377XZ 2563 ESB ABC  CR PMC21402XZ 2622 ESB ABC
DL PMC24300XZ 2404 ESB ABC  DR PMC26742XZ 2446 ESB ABC 
EL PMC23546XZ 2682 ESB ABC  ER PMC27450XZ 2774 ESB ABC
FL PMC22126C6 3022 ESB ABC  FR PMC21220XZ 3292 ESB ABC
GL PMC21077XZ 2982 ESB ABC  GR PMC28748XZ 2998 ESB ABC
HL PMC26051XZ 2492 ESB ABC  HR PMC53510R7 2928 ESB ABC
JL PMC24177XZ 3014 ESB ABC  JR PMC21444XZ 2873 ESB ABC
KL PMC24466XZ 2781 ESB ABC  KR PMC21778XZ 2513 ESB ABC
LL PMC22897XZ 2454 ESB ABC  LR PMC26473XZ 2778 ESB ABC
ML PMC27854XZ 2824 ESB ABC  MR PMC26001XZ 3218 ESB ABC
PL PAJ1129 XZ 2279 ESB ABC  PR PAJ51477XZ 2398 ESB ABC
RC PMC58993R7 2176 ESB ABC    
LOWER DECK
FWD
11P PMC28357XZ 1122 ESB ABC
12P PMC24753XZ 1589 ESB ABC
13P PMC26671XZ 1862 ESB ABC 
21P PMC28016XZ 3386 ESB ABC
</pre>

票数 1
EN

Stack Overflow用户

发布于 2018-12-05 17:57:03

我让它成功了。

问题是\d造成的。

代码语言:javascript
复制
function autoPlay(){
	var arr = [
				[" +", "g" ,"/"],
				["(?=[A-Z]R/)", "g","$&\n"],
				["([0-9]{1,5})\/([A-Z]{3})" ,"g", "$2/$1"]
				];
	var arrL = arr.length;
	var str = document.getElementById('val');
	for (var i = 0; i < arrL; i++) {
		var restoredRegex = new RegExp(arr[i][0], arr[i][1]);
		var result = str.innerHTML.replace(restoredRegex, arr[i][2]);
		str.innerHTML = result
	}
}
代码语言:javascript
复制
#val{
  border: 1px solid grey;
  padding: 5px;
  height: 300px;
  width: 500px;
  overflow: auto;
}
代码语言:javascript
复制
<button type="button" onClick="autoPlay()">
GO
</button>
<pre id="val" contenteditable="true" spellcheck="false">
AL PAG31503XZ 2351 ESB ABC  AR PAG30079XZ 2213 ESB ABC
BL PMC16410R7 1798 ESB ABC  BR PMC27936XZ 2444 ESB ABC
CL PMC27377XZ 2563 ESB ABC  CR PMC21402XZ 2622 ESB ABC
DL PMC24300XZ 2404 ESB ABC  DR PMC26742XZ 2446 ESB ABC 
EL PMC23546XZ 2682 ESB ABC  ER PMC27450XZ 2774 ESB ABC
FL PMC22126C6 3022 ESB ABC  FR PMC21220XZ 3292 ESB ABC
GL PMC21077XZ 2982 ESB ABC  GR PMC28748XZ 2998 ESB ABC
HL PMC26051XZ 2492 ESB ABC  HR PMC53510R7 2928 ESB ABC
JL PMC24177XZ 3014 ESB ABC  JR PMC21444XZ 2873 ESB ABC
KL PMC24466XZ 2781 ESB ABC  KR PMC21778XZ 2513 ESB ABC
LL PMC22897XZ 2454 ESB ABC  LR PMC26473XZ 2778 ESB ABC
ML PMC27854XZ 2824 ESB ABC  MR PMC26001XZ 3218 ESB ABC
PL PAJ1129 XZ 2279 ESB ABC  PR PAJ51477XZ 2398 ESB ABC
RC PMC58993R7 2176 ESB ABC    
LOWER DECK
FWD
11P PMC28357XZ 1122 ESB ABC
12P PMC24753XZ 1589 ESB ABC
13P PMC26671XZ 1862 ESB ABC 
21P PMC28016XZ 3386 ESB ABC
</pre>

P.S --它正在制造问题\d. (在@ Nelson的回答之前,它不知道为什么会发生这种情况,所以我用0-9替换了\d,使它与一些Juggad一起工作)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53636413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档