gpt4 book ai didi

正则表达式 IF THEN ELSE 语句

转载 作者:行者123 更新时间:2023-12-03 02:39:05 25 4
gpt4 key购买 nike

我需要编写一个正则表达式,这让我摸不着头脑。本质上,我有一列数据,其中包含以下值:

ACME Corp 123
Corp 742 ACME
Random Text
Broadway 1785 FB

我想要做的是查找术语 ACMEBROADWAY。如果其中任何一个存在,则仅保留它。如果两者都不存在,则保留整个字符串。因此上面的列将变成:

ACME
ACME
Random Text
Broadway

这有意义吗?

最佳答案

简介

这个让我有点摸不着头脑。我确信仅使用正则表达式并不是解决此问题的最佳方法,但是,这是您的解决方案。

<小时/>

代码

See this code in use here

正则表达式

^.*?((?(?=.*?(\b(?:broadway|acme)\b).*?)\2|.*)).*?$

替换

第 1 组如下。您可以从匹配数组中收集第 1 组变量,但如果您想替换,可以使用以下内容

$1
<小时/>

结果

注意:我添加了另一个字符串作为测试,以确保如果任一单词放置在一行中间,它仍然会捕获它。

输入

ACME Corp 123
Corp 742 ACME
Some ACME some
Random Text
Broadway 1785 FB

输出

ACME
ACME
ACME
Random Text
Broadway
<小时/>

说明

使用不区分大小写i和多线m标志:

  • ^断言位置位于行首
  • .*?匹配任何字符任意次数,但尽可能少
  • ((?(?=.*?(\b(?:broadway|acme)\b).*?)\2|.*))分成几部分
    • ()捕获以下内容
      • (?(?=...)) if/else 语句
      • (?=.*?(\b(?:broadway|acme)\b).*?)正向前瞻以匹配以下内容
        • .*?任何字符任意次数,但尽可能少
        • (...)将以下内容捕获到捕获组 2
        • \b(?:broadway|acme)\b字边界,后跟 broadwayacme ,后跟单词边界
        • .*?任何字符任意次数,但尽可能少
      • \2如果 if/else 语句为 true(与上面的匹配),则捕获该组(如上所述) - 这就是 broadwayacme
      • .*如果 if/else 语句为 false,则匹配任意字符任意次
  • .*?匹配任何字符任意次数,但尽可能少
  • $断言位置位于行尾

——

更新

由于我的答案引起了相当多的关注,我认为我应该修改它。不确定注意力是否集中在正则表达式中的 if/else,或者它是否更多地与 OP 从示例输入中得到的预期结果相关。

如果/否则

我应该提到,正则表达式 if/else 的一般格式如下(并且只有某些正则表达式引擎支持此标记):

(?(?=condition)x|y)

在上面的正则表达式中 (?=condition) 几乎可以是您想要的任何内容(您也可以使用负向前查找或向后查找,甚至它们的组合。

替代方案

由于并非所有语言都支持正则表达式中的 if/else,您也许可以使用解决方法:

# optional group, fallback to match all (x?y)
^(?:.*?\b(broadway|acme)\b)?.*

# alternation (x||y)
^(?:.*?\b(broadway|acme)\b|.*)

# tempered greedy token alternation
^(?:(?!\b(?:broadway|acme)\b).|(broadway|acme))+

# same as above reusing capture group 1’s definition
^(?:(?!\b(broadway|acme)\b).|((?1)))+

关于正则表达式 IF THEN ELSE 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46432854/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com