【问题标题】:Regex not getting entire substring正则表达式没有得到整个子字符串
【发布时间】:2017-07-26 02:23:02
【问题描述】:

我的输入字符串如下所示:

&hello=HI1&op=1h23&hello=&op=&hello=HI3&op=&hello=HI4&op=OP4

如果 hello 有文本,我希望捕获数据。 op 参数是可选的,可能有也可能没有值。在上面的字符串中,我想要以下输出(每一行将作为一个单独的值存储在一个数组中):

hello=HI&op=1h23
hello=HI3&op=
hello=HI4&op=OP4

我已经让它大部分工作了,但问题是如果 op 的值包含单词 'hello' 中的任何字母,则不会捕获 op 的剩余部分。正如您在上面的示例字符串中看到的,第一个 op 值是 1h23,在 h 之后,没有捕获值 23。

https://regex101.com/r/Er0kEo/2

我试过了:

/&hello=[A-z 0-9]+&op=[^&hello]*/gi

这通常有效,除非 op 的值包含单词“hello”中的任何字母。我也试过:

/&hello=[A-z 0-9]+&op=.+?(?=&hello)/gi

仅捕获第一个输入。也尝试过 (?!&hello) - 稍微好一点,但没有捕获最后的输入。尝试使用 \b 并没有走得太远,^&hello$ 也没有。

我觉得我错过了一些小事,但 5 小时后,我被打败了。

【问题讨论】:

  • 是不是所有的key都和hello一样? &op 是否存在于所有值中?并且您只需要提取那些在&op 之前有一些文本的内容?
  • jsfiddle.net/jqu5motj/1,它是否按预期工作?
  • @WiktorStribiżew:是的,这太完美了!它也很简单,有点惊讶我无法弄清楚/没有尝试只是 [^&]*。谢谢!

标签: javascript regex


【解决方案1】:

尝试以下正则表达式(使用positive look-ahead

hello=[a-z0-9]+&op=[^&]*

DEMO

JavaScript

var str = "&hello=HI1&op=1h23&hello=&op=&hello=HI3&op=&hello=HI4&op=OP4";
var result = str.match(/hello=[a-z0-9]+&op=[^&]*/gi);
console.log(result);

【讨论】:

  • [A-z] matches more than letters,但我猜这里的意义不大。相关的是,OP 期望在没有领先 & 的情况下获得结果。此外,如果您将 .*?(?=&|$)[^&]* 进行比较,它是“矫枉过正”。
  • 当我这样做时,我一定会的。
【解决方案2】:
/hello=[a-z\s0-9]+&op=[a-z0-9]*/gi

结果

Match 1
Full match  1-18    `hello=HI1&op=1h23`
Match 2
Full match  30-43   `hello=HI3&op=`
Match 3
Full match  44-60   `hello=HI4&op=OP4`

https://regex101.com/r/Er0kEo/3

【讨论】:

    【解决方案3】:

    使用正则表达式/&(hello=\w*&op=\w*)/,将给出以下必需的匹配项:

    hello=HI&op=1h23
    hello=HI3&op=
    hello=HI4&op=OP4
    

    JavaScript 演示

    var pattern = /&(hello=\w*&op=\w*)/g;
    
    var str = "&hello=HI1&op=1h23&hello=&op=&hello=HI3&op=&hello=HI4&op=OP4";
    
    var result;
    
    while (result = pattern.exec(str)) {
      console.log(result[1]);
    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多