替换除匹配字符串JS Regex之外的所有内容

Replace everything except the matched string - JS Regex

本文关键字:Regex 字符串 JS 替换      更新时间:2023-09-26

Java Script中的另一个"否定匹配"/"匹配除外的所有内容"问题。

所以我想做的是:

我有一个巨大的文本文件,我想从文件中删除除用户名/密码行之外的所有内容。以下是文本中的示例部分:

<property name="password">QWERTY</property>
....lots of similar tags......
<property name="username">Hello</property>
<property name="passive">1</property>
<property name="password">Test Password</property>
<property name="scheme">smb</property>
<property name="timeout">10000</property>
<property name="username">RANDOM USER</property>
....lots of similar tags......
<property name="username">Sid</property>

我想删除不是密码或用户名的每一行。

我尝试了以下替换功能,至少从密码开始,但似乎不起作用:

incomingString = incomingString.replace(/['W'w]*?(?=<property name="password">['W'w]*?</property).*?/g,"");

回过头来看,我可以理解正则表达式有太多的问题,所以我希望知道一个有效的正则表达式,它可以帮助我删除前面提到的文本中的所有行,并留给我

<property name="password">QWERTY</property>
<property name="username">Hello</property>
<property name="password">Test Password</property>
<property name="username">RANDOM USER</property>
<property name="username">Sid</property>

PS:重要的是,他们在文件中的订单应该保持

我在SO上讨论了一些关于JavaScript正则表达式中这个无休止问题的问题(this和lookbehinds),但答案非常具体。

如有任何帮助,我们将不胜感激。

谢谢。

您可以将此正则表达式用于String#match调用:

/<property[^>]*name="(username|password)[^>]*>[^<]*</property>/gi

RegEx演示

尽管我仍然认为您最好在这里使用XML解析器,但这应该解决一行问题:

<property[^>]*name="(username|password)".*?</property>

http://regex101.com/r/oM7aD2/1

如果匹配文字<property,后面跟着任意数量的非文字>的字符(如果行的第一个标记不是usernamepassword,则无法进行匹配),则其余部分与@anubhava的相同(尽管我可以随意添加第二个文字",以防遇到其他以usernamepassword为前缀的属性,例如password_expires