【问题标题】:regex to extract substring for special cases正则表达式提取特殊情况的子字符串
【发布时间】:2021-12-16 01:48:56
【问题描述】:

我有一个场景,我想根据以下条件提取一些子字符串。

  1. 搜索任何模式 myvalue=123& ,提取 myvalue=123
  2. 如果“myvalue”出现在没有“&”的行尾,则提取 myvalue=123

例如:

The string is abcdmyvalue=123&xyz => the it should return  myvalue=123
The string is abcdmyvalue=123 => the it should return  myvalue=123

对于第一种情况,它使用以下正则表达式对我有用 - myvalue=(.?(?=[&,""])) 我正在寻找如何修改这个正则表达式以包括我的第二个场景。我正在使用https://regex101.com/ 进行测试。
提前感谢!

【问题讨论】:

    标签: regex regexp-replace


    【解决方案1】:

    关于您尝试过的模式的一些说明

    • 如果只想匹配,可以省略捕获组
    • e* 匹配 0+ 次 e 字符
    • .*?(?=[&,""]) 部分匹配最少的字符,直到它可以将 eiter & ," 断言到右侧,因此正向前瞻期望右侧存在单个字符

    您可以将模式缩短为仅匹配,使用否定字符类匹配除空白字符或 & 之外的任何字符 0+ 次

    myvalue=[^&\s]*
    

    Regex demo

    【讨论】:

    • 谢谢,这看起来不错。但这不会仅捕获匹配的第一次出现。例如: 123myvalue=123&abcdmyvalue=567& - 在这种情况下,它显示两个匹配项。有没有办法找到第一次出现?
    • @BigD 是的,在这种情况下,您可以使用例如捕获组^.*?(myvalue=[^&\s]*) 请参阅regex101.com/r/gOZLXo/1
    • 谢谢。它的工作。接受答案
    【解决方案2】:
    function regex(data) {
    var test = data.match(/=(.*)&/);
    if (test === null) {
    return data.split('=')[1]
    } else {
    return test[1]
    }
    }
    
    console.log(regex('abcdmyvalue=123&3e')); //123
    console.log(regex('abcdmyvalue=123')); //123
    

    这是你的工作代码,如果字符串末尾没有 & 它将有 null 并且会在那里阻塞我们可以简单地拆分字符串并获取值,如果 & 出现在字符串末尾,那么正则表达式将只需提取 = 和 & 之间的值

    如果你想使用现有的正则表达式,那么你可以这样做

    var test = data1.match(/=(.*)&|=(.*)/)
    
    const result = test[1] ? test[1] : test[2];
    console.log(result);
    

    【讨论】:

    • 谢谢,我希望修改我现有的正则表达式以包含我的第二个条件。
    • 如果你想使用现有的正则表达式,那么你可以这样做 var test = data1.match(/=(.*)&|=(.*)/) const result = test[1 ] ?测试[1]:测试[2];控制台日志(结果);
    • 抱歉,我正在regex101.com 中进行此测试,以便将正则表达式用于其他目的。我不能使用这种编码。
    猜你喜欢
    • 2019-04-01
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多