【问题标题】:Regex to remove strings from list that do not match given prefix正则表达式从列表中删除与给定前缀不匹配的字符串
【发布时间】:2021-06-16 14:59:28
【问题描述】:

我有一个字符串,其中包含多个以逗号分隔的值列表,始终嵌入在 <mks:Field name="MyField"></mks:Field> 之间。

例如:

<mks:Field name="MyField">X001_ABC</mks:Field><mks:Field name="AnotherField">X002_XYZ</mks:Field><mks:Field name="MyField"></mks:Field><mks:Field name="MyField">X000_Test1,X000_Test2</mks:Field><mks:Field name="MyField">X001_ABC,X000_Test1</mks:Field><mks:Field name="MyField">X000_Test1,X000_Test2,X002_XYZ</mks:Field>

在此示例中,我可以使用以下值:

  • X001_ABC
  • (空)
  • X000_Test1,X000_Test2
  • X001_ABC,X000_Test1
  • X000_Test1,X000_Test2,X002_XYZ

现在我想删除所有不以前缀“X000_”开头的值,包括任何不必要的逗号,这样我的结果如下所示:

<mks:Field name="MyField"></mks:Field><mks:Field name="AnotherField">X002_XYZ</mks:Field><mks:Field name="MyField"></mks:Field><mks:Field name="MyField">X000_Test1,X000_Test2</mks:Field><mks:Field name="MyField">X000_Test1</mks:Field><mks:Field name="MyField">X000_Test1,X000_Test2</mks:Field>

我尝试了以下正则表达式,但如果只有一个值与我的正则表达式不匹配,并且如果引入了与我的前缀匹配的新值(例如 X000_Test3),我不想更改我的正则表达式,则它不能正常工作。

搜索:(?&lt;=name="MyField"&gt;)[^&lt;&gt;](?:.*?(X000_Test1,X000_Test2|X000_Test1|X000_Test2))?.*?(?=&lt;/mks:Field&gt;)

替换:\1

这给了我以下与预期输出不匹配的结果:

<mks:Field name="MyField">X000_Test1,X000_Test2</mks:Field><mks:Field name="MyField">X000_Test1</mks:Field><mks:Field name="MyField">X000_Test2</mks:Field>

不幸的是,我不能简单地用其他东西解析字符串 - 在这种情况下,我只能选择正则表达式搜索/替换。

提前感谢您,任何帮助将不胜感激。

【问题讨论】:

  • 如果要删除所有不以X000_ 开头的值,请尝试regex101.com/r/LNqg9t/1 工具或语言是什么?
  • @Thefourthbird 你的正则表达式正是我想要的!不幸的是,该工具在 python 中运行正则表达式(对不起,我现在添加了标签),据我所知,python 不支持 \G 和 \K。关于如何在不访问 python 脚本本身的情况下解决这个问题的任何想法?非常感谢您的支持!
  • 你能安装PyPi regex module吗?

标签: python python-3.x regex


【解决方案1】:

如果您使用的是 Javascript,请使用:

prefix='X000';

let pattern= new RegExp(`((?<=>)|,)((?!${prefix}|[>\<,]).)*(,|(?=\<))`, 'g');

对于任何其他语言,请使用:

'/((?<=>)|,)((?!X000|[>\<,]).)*(,|(?=\<))/';

X000 是您要保留的前缀

【讨论】:

    猜你喜欢
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多