我正在尝试对字符串执行一些替换操作。替换操作存储在数组中。一切进展顺利,直到第三幕。我不能让那个人工作,也不明白为什么。它没有给出错误,只是没有执行最后一次替换"/(\d{1,5})/([A-Z]{3})/g","$2/$1"。
第一个替换用斜杠替换所有空格,第二个替换从右边的字符串向下移动(插入新行),第三个替换应该用前面的4位数字交换ESB字符串。
例如
AR/PAG30079XZ/2213/ESB/ABC就会变成AR/PAG30079XZ/ESB/2213/ABC
最后一个部分不起作用
到目前为止,我得到的是:
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
}
}#val{
border: 1px solid grey;
padding: 5px;
height: 300px;
width: 500px;
overflow: auto;
}<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>
发布于 2018-12-05 17:44:18
问题是,你在第三次审判中的\n \d无法逃脱。看一看:
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
}
}#val{
border: 1px solid grey;
padding: 5px;
height: 300px;
width: 500px;
overflow: auto;
}<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>
如果您试图在这一行之后执行控制台日志:
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),你就完蛋了。
这个代码的一个更好的版本是:
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]);
})
}#val{
border: 1px solid grey;
padding: 5px;
height: 300px;
width: 500px;
overflow: auto;
}<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>
发布于 2018-12-05 17:57:03
我让它成功了。
问题是\d造成的。
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
}
}#val{
border: 1px solid grey;
padding: 5px;
height: 300px;
width: 500px;
overflow: auto;
}<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一起工作)。
https://stackoverflow.com/questions/53636413
复制相似问题