吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 843|回复: 16
收起左侧

[已解决] 小白关于JavaScript的replace正则替换问题求助

[复制链接]
zjty123 发表于 2022-9-22 19:49
本帖最后由 zjty123 于 2022-9-24 11:53 编辑

已解决,十分感谢@Takitooru @HA? 两位大佬这两天的耐心帮助和解答疑问,好人一生平安,感恩,感谢
=============================================================
有这样一段文字,我用replace的正则替换把其中的非重要重复性内容替换成无以保留核心内容,其中最核心的我通过正则替换掉非核心的同样的内容搞定了,其他重复一样的部分我可以通过手工补充的方式在后面补足。
我想更进一步保留其中我想保留的更多内容,不知道该如何修改?
"useShenFuShi('fitems.shenfu.ShenFuShi_Lv','248067531','力量之巨神板甲','248071750','fitems.arm.armor.plate.chest.lv060.uncommon.LiLiangJuShenBanJia


上述部分,蓝底黑字内容("useShenFuShi('','','力量之巨神板甲','',')一共4部分需替换为单空格(每个部分只需要一个单空格),只保留黄底黑字和绿底黑字(fitems.shenfu.ShenFuShi_Lv248067531248071750fitems.arm.armor.plate.chest.lv060.uncommon.LiLiangJuShenBanJia)的内容。
我通过正则替换的方式,做到了只保留绿底黑字的那串数字,我不知道该怎样修改才能达到保留黄底黑字和绿底黑字内容且每部分内容间以单空格间隔。
这是我自己修改的只保留绿底黑字的正则替换(如下),下方的main.cmd内的需要我自己手动补充更改。
[JavaScript] 纯文本查看 复制代码
gwattstr = gwinf.toString().substring(0, gwatted).replace(/\"|\'|,|\(|useShenFuShi|fitems.shenfu.ShenFuShi_Lv|248067531|力量之巨神板甲|fitems.arm.armor.plate.chest.lv060.uncommon.LiLiangJuShenBanJia/g, "");
                main.cmd("use " + "fitems.shenfu.ShenFuShi_Lv " + "248067531 " + gwattstr + " fitems.arm.armor.plate.chest.lv060.uncommon.LiLiangJuShenBanJia" + " false");

我自己尝试修改了一版(如下),但是有问题无法达到效果,修改版如下。希望大佬指点下,我有考虑过加function(),但是看不懂他们的。我为了搞懂replace写出上面这个正则替换就琢磨了4小时,更深入的看视频也看不懂了
[JavaScript] 纯文本查看 复制代码
gwattstr = gwinf.toString().substring(0, gwatted).replace(/\"useShenFuShi\(\'|(\',\'力量之巨神板甲\',\')|\',\'|/g, " ");
                main.cmd("use" + gwattstr + " false");

也许也可以用其他的函数,不仅限于replace,但是我没编程基础,最好也只能做到第一段代码那样了。求大佬指点帮助。

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Takitooru 发表于 2022-9-23 00:11
代码
//源字符串
var str = "\'useShenFuShi('fitems.shenfu.ShenFuShi_Lv','248067531','力量之巨神板甲','248071750','fitems.arm.armor.plate.chest.lv060.uncommon.LiLiangJuShenBanJia";
//正则规则
var re = /fitems.shenfu.ShenFuShi_Lv|(?<=\'\,\')(\d+)|fitems.arm.armor.plate.chest.lv060.uncommon.LiLiangJuShenBanJia/gi;
var data = str.match(re); 
//data转换成字符串并用空格分隔
var sp = data.join(" ");
//输出结果
console.log(sp);    


截图

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
zjty123 + 1 + 1 谢谢@Thanks!

查看全部评分

a446489393 发表于 2022-9-23 08:55
shift1110 发表于 2022-9-23 08:57
 楼主| zjty123 发表于 2022-9-23 12:57
本帖最后由 zjty123 于 2022-9-23 12:59 编辑
Takitooru 发表于 2022-9-23 00:11
代码
[md]```
//源字符串

大神您好,感谢您凌晨的解答,我把您的代码放到了我的程序中,但是不知道什么原因执行不了,因为不是在浏览器中执行,为第三方程序运行,代码为外置代码,程序读取文本运行,因此无法知道是哪里的问题。反复核查多遍无遗漏和错误,我提供更完整的代码,希望您能在百忙之中再抽空帮忙指点下看下问题究竟出现在哪,感谢。

[Asm] 纯文本查看 复制代码
//这是从网页提取的完整内容,实际多为重复内容,只有第二组数字不同,这也是第二组数字为核心的原因
"useShenFuShi('fitems.shenfu.ShenFuShi_Lv','248067531','力量之巨神板甲','248071752','fitems.arm.armor.plate.chest.lv060.uncommon.LiLiangJuShenBanJia');offOpenWin('showCanUseShenFuShiItems');return false;"
"useShenFuShi('fitems.shenfu.ShenFuShi_Lv','248067531','力量之巨神板甲','248071753','fitems.arm.armor.plate.chest.lv060.uncommon.LiLiangJuShenBanJia');offOpenWin('showCanUseShenFuShiItems');return false;"


这是更完整的代码及我的一点点浅陋理解,如有理解错误望指点一二,希望您能在百忙之中再抽空帮忙指点下看下问题原因是什么该如何解决,十分感谢。
[JavaScript] 纯文本查看 复制代码
//定位showCanUseShenFuShiItems
        var x = main.document.getElementById("showCanUseShenFuShiItems").getElementsByTagName("tr");
//提前定义
        var gwinf, gwattst, gwatted, gwattstr, gwattre, gwattdata, gwattsp;
        for (var i = 0; i < x.length; i++) {
//此处的x[i].innerHTML和上方的“xar x”及“var i”有关,应该是定义到表单的innerHTML
            gwinf = x[i].innerHTML;
//匹配索引到"力量之巨神板甲"则执行指定代码
            if (gwinf.indexOf("力量之巨神板甲") != -1) {
//匹配索引定位{"useShenFuShi('}开头
                gwattst = gwinf.indexOf("useShenFuShi('");
//这个我没太看懂,大概是定义内容长度?
                gwinf = gwinf.toString().substring(gwattst, gwinf.toString().length);
//匹配索引定义内容结尾{')},即内容末尾的{LiLiangJuShenBanJia')}的{')}
                gwatted = gwinf.indexOf("')");
//从内容的开头{"useShenFuShi('}开始到gwatted结束,如果我没理解错的话
                gwattstr = gwinf.toString().substring(0, gwatted);
                gwattre = /fitems.shenfu.ShenFuShi_Lv|(?<=\'\,\')(\d+)|fitems.arm.armor.plate.chest.lv060.uncommon.LiLiangJuShenBanJia/gi;
                gwattdata = gwattstr.match(gwattre);
                gwattsp = gwattdata.join(" ");
//此处就是把gwattsp加进去以组合成完整指令。如use fitems.shenfu.ShenFuShi_Lv 248098240 248098351 fitems.arm.armor.plate.chest.lv060.uncommon.LiLiangJuShenBanJia false
                main.cmd("use " + gwattsp + " false");
            }
        }


HA? 发表于 2022-9-23 15:23
既然你喜欢replace方法,那就给你这种写法
这种方法的实现方式是匹配整个分组,同时将你需要取出的四处文本记录在字表达式中,最终在替换时将四个表达式存留下来然后中间用空格隔开


[Asm] 纯文本查看 复制代码
var str = "\"useShenFuShi('fitems.shenfu.ShenFuShi_Lv','248067531','力量之巨神板甲','248071750','fitems.arm.armor.plate.chest.lv060.uncommon.LiLiangJuShenBanJia";

str.replace( /\"useShenFuShi\('([^']+)','([^']+)','[^']+','([^']+)','([^']+)/g ,"$1 $2 $3 $4");


使用replace替换.png

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
zjty123 + 1 + 1 谢谢@Thanks!

查看全部评分

HA? 发表于 2022-9-23 15:35
当然,楼主的思路也是没有问题的,将不需要的数据替换成空格,这种方法也可以,只要更换正则表达式就可以了


[JavaScript] 纯文本查看 复制代码
var str = "\"useShenFuShi('fitems.shenfu.ShenFuShi_Lv','248067531','力量之巨神板甲','248071750','fitems.arm.armor.plate.chest.lv060.uncommon.LiLiangJuShenBanJia";

str.replace(/.+?useShenFuShi\('|','力量之巨神板甲','|','|'\);.+/g ," ");


使用replace替换.png
 楼主| zjty123 发表于 2022-9-23 17:36
HA? 发表于 2022-9-23 15:35
当然,楼主的思路也是没有问题的,将不需要的数据替换成空格,这种方法也可以,只要更换正则表达式就可以了 ...

您好,感谢您提供的两个方法,我看您两个方法的输出内容的截图显示都是正常的,且每部分都有空格间隔;但是我在运行中这两个方法都遇到了问题,代码能正常运行,输出的内容却不对,我看不到程序输出的时内容是什么(因为是第三方的程序读取外置的代码文档进行执行,没有控制台),但我知道正确的输出后产生的显示结果及错误输出后产生的显示结果是怎样的。我说一下我的疑问点,望您抽空指教一下,感谢。
第一个方法:
var str = "\"useShenFuShi('fitems.shenfu.ShenFuShi_Lv','248067531','力量之巨神板甲','248071750','fitems.arm.armor.plate.chest.lv060.uncommon.LiLiangJuShenBanJia";
str.replace( /\"useShenFuShi\('([^']+)','([^']+)','[^']+','([^']+)','([^']+)/g ,"$1 $2 $3 $4");
第一个方法中我所理解的:上一行我标黄底部分就是您代码中的$1$2$3$4替换成无,未标底色部分即为保留的文字部分,然后$1 $2 $3 $4中间的3个空格指代空格间隔,是吗?

这是用您第一个方法更改后的代码:
[JavaScript] 纯文本查看 复制代码
//这个gwattstr其实就是下面注释里大括号里的内容,只是在这里是定义的相应网页的DOM资源管理器里的某部分内容,没有具体定义,后续有其他代码和该部分代码组成循环执行
//{"useShenFuShi('fitems.shenfu.ShenFuShi_Lv','248067531','力量之巨神板甲','248071750','fitems.arm.armor.plate.chest.lv060.uncommon.LiLiangJuShenBanJia}
var gwattstr = gwinf.toString().substring(0, gwatted);
var gwattre = gwattstr.replace(/\"useShenFuShi\('([^']+)','([^']+)','[^']+','([^']+)','([^']+)/g, "$1 $2 $3 $4");
//这个main.cmd就是组合上面的正则替换后的内容输出成指令。
//比如输出成这样use fitems.shenfu.ShenFuShi_Lv 248098240 248098351 fitems.arm.armor.plate.chest.lv060.uncommon.LiLiangJuShenBanJia false
main.cmd("use " + gwattre + " false");


第二个方法:
var str = "\"useShenFuShi('fitems.shenfu.ShenFuShi_Lv','248067531','力量之巨神板甲','248071750','fitems.arm.armor.plate.chest.lv060.uncommon.LiLiangJuShenBanJia";
str.replace(/.+?useShenFuShi\('|','力量之巨神板甲','|','|'\);.+/g ," ");
第二个方法中我所理解的:四个黄底部分(为更直观采用两种黄色间隔)即替换成空格部分,但是前面的.+?部分和后面的\);.+部分我不太能理解,但是没关系,因为看您输出是没问题的,只是我不知道输出的有问题的点在哪里。

这是我用您第二个方法更改后的代码:
[JavaScript] 纯文本查看 复制代码
//这个我就不写注释了,注释内容和上面我第一个修改的代码里的是一样的
var gwattstr = gwinf.toString().substring(0, gwatted);
var gwattre = gwattstr.replace(/.+?useShenFuShi\('|','力量之巨神板甲','|','|'\);.+/g ," ");
main.cmd("use " + gwattre + " false");


我写的有些啰嗦,让您见笑了,望您百忙之中抽空指教一二,十分感谢
Takitooru 发表于 2022-9-23 17:44
zjty123 发表于 2022-9-23 12:57
大神您好,感谢您凌晨的解答,我把您的代码放到了我的程序中,但是不知道什么原因执行不了,因为不是在浏 ...
如果你这个  gwinf.toString().substring(0, gwatted)  变量是这样的

“useShenFuShi('fitems.shenfu.ShenFuShi_Lv','248067531','力量之巨神板甲','248071750','fitems.arm.armor.plate.chest.lv060.uncommon.LiLiangJuShenBanJia

则需要把前面的双引号转义

gwattstr = gwinf.toString().substring(0, gwatted);
改成这样
gwattstr = "\"+gwinf.toString().substring(0, gwatted)+";
 楼主| zjty123 发表于 2022-9-23 19:30
Takitooru 发表于 2022-9-23 17:44
[md]```
如果你这个  gwinf.toString().substring(0, gwatted)  变量是这样的

您好,再次感谢您新的指点。
我尝试按您所说的更改了gwattstr,但程序还是跑不通无法正常运行,我不知道是哪里的问题,不知您是否使用了类似await之类的高版本的函数?我这个程序兼容性比较低,像await、箭头函数等都无法使用。
我个人认为gwattstr是没有问题的,因为之前没有对gwattstr的变量的单双引号等进行转义时用replace时在replace里进行转义正则替换是正常的能运行。
您看这段,gwattstr无更改,replace单独一个定义,程序是能跑通且正常运行的,因此我判断不是gwattstr变量的问题。有没有可能是后面的某个函数的兼容性或其他问题呢?盼解答,感谢
[Asm] 纯文本查看 复制代码
//"useShenFuShi('fitems.shenfu.ShenFuShi_Lv','248186767','力量之巨神板甲','248186786','fitems.arm.armor.plate.chest.lv060.uncommon.LiLiangJuShenBanJia
var gwattstr = gwinf.toString().substring(0, gwatted);
var gwattre = gwattstr.replace(/\"|\'|,|\(|useShenFuShi|fitems.shenfu.ShenFuShi_Lv|248186767|力量之巨神板甲|fitems.arm.armor.plate.chest.lv060.uncommon.LiLiangJuShenBanJia/g, "");
//(下面cmd)结合后的指令:use fitems.shenfu.ShenFuShi_Lv 248186767 248186786 fitems.arm.armor.plate.chest.lv060.uncommon.LiLiangJuShenBanJia false
main.cmd("use " + "fitems.shenfu.ShenFuShi_Lv " + "248186767 " + gwattre + " fitems.arm.armor.plate.chest.lv060.uncommon.LiLiangJuShenBanJia" + " false");
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 07:23

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表