正则表达式以获取Javascript中两个字符串之间的字符串

正则表达式以获取Javascript中两个字符串之间的字符串,javascript,regex,string,Javascript,Regex,String,我已经找到了非常类似的帖子,但我不能在这里得到我的正则表达式 我正在尝试编写一个正则表达式,它返回一个介于其他两个字符串之间的字符串。例如:我想得到位于字符串“cow”和“milk”之间的字符串 我的母牛总是产奶 会回来吗 “总是给予” 以下是我到目前为止拼凑的表达: (?=cow).*(?=milk) 但是,这将返回字符串“cow always gives”。一个向前看(即(?=部分)不使用任何输入。它是一个零宽度断言(边界检查和向后看也是如此) 您需要在此处进行常规匹配,以使用cow部分。

我已经找到了非常类似的帖子,但我不能在这里得到我的正则表达式

我正在尝试编写一个正则表达式,它返回一个介于其他两个字符串之间的字符串。例如:我想得到位于字符串“cow”和“milk”之间的字符串

我的母牛总是产奶

会回来吗

“总是给予”

以下是我到目前为止拼凑的表达:

(?=cow).*(?=milk)
但是,这将返回字符串“cow always gives”。

一个向前看(即
(?=
部分)不使用任何输入。它是一个零宽度断言(边界检查和向后看也是如此)

您需要在此处进行常规匹配,以使用
cow
部分。要捕获中间的部分,请使用捕获组(只需将要捕获的图案部分放在括号内):

cow(.*)牛奶
根本不需要任何外观。

  • 您需要捕获
    *
  • 您可以(但不必)将
    *
    设置为非reedy
  • 真的没有必要向前看

    > /cow(.*?)milk/i.exec('My cow always gives milk');
    ["cow always gives milk", " always gives "]
    

    • 这里有一个正则表达式,它可以抓住奶牛和牛奶之间的内容(没有前导/尾随空格):


      例如:

      只需使用以下正则表达式即可:

      (?<=My cow\s).*?(?=\smilk)
      
      (?
      正则表达式以获取JavaScript中两个字符串之间的字符串

      在绝大多数情况下,最完整的解决方案是使用带有惰性点匹配模式的捕获组。但是,JavaScript正则表达式中的点
      与换行符不匹配,因此,在100%情况下有效的是
      [^]
      [\s\s]
      /
      [\d\d]
      /
      [\w\w]
      构造

      ECMAScript 2018和更新的兼容解决方案 在支持ECMAScript 2018的JavaScript环境中,
      s
      修饰符允许
      匹配任何字符,包括换行字符,并且regex引擎支持可变长度的lookbehind。因此,您可以使用类似regex的

      var result = s.match(/(?<=cow\s+).*?(?=\s+milk)/gs); // Returns multiple matches if any
      // Or
      var result = s.match(/(?<=cow\s*).*?(?=\s*milk)/gs); // Same but whitespaces are optional
      
      cow
      首先被找到,然后是一个空格,然后是除换行符以外的任何0+字符,尽可能少的
      *?
      是一个惰性量词,被捕获到组1中,然后必须跟随一个含有
      milk
      的空格(这些字符也被匹配和消耗)

      场景2:多行输入 在这里,
      cow
      首先匹配一个空格,然后匹配尽可能少的任何0+字符并将其捕获到组1中,然后匹配带有
      milk
      的空格

      场景3:重叠匹配 如果您有一个字符串,如
      >>>15 text>>>67 text2>>>>
      ,并且需要在
      >>>
      +
      数字
      +
      空格
      >>
      之间找到2个匹配项,您不能使用,因为这将只找到1个匹配项,因为在找到第一个匹配项时,
      67
      之前的
      >
      已被消耗。Y您可以使用来检查文本是否存在,而不实际“吞食”它(即附加到匹配项):

      请将
      text1
      text2
      作为找到的第1组内容

      另见

      性能注意事项 如果输入很长,正则表达式模式中的惰性点匹配模式(
      *?
      )可能会降低脚本执行速度。在许多情况下,这在很大程度上是有帮助的。尝试从
      他们的\ncow\ngives\nmore\nmilk>中获取
      奶牛
      牛奶
      之间的所有内容
      ,我们只需要匹配所有不以
      milk
      开头的行,因此,我们可以使用:

      /cow\n(.*(?:\n(?!milk$).*)*)\nmilk/gm
      
      请参阅(如果可以使用
      \r\n
      ,请使用
      /cow\r?\n(.*(?:\r?\n(?!milk$)*))\r?\nmilk/gm
      )。使用此小测试字符串,性能增益可以忽略不计,但如果文本非常大,您会感觉到差异(特别是当行很长且换行次数不多时)

      JavaScript中正则表达式的示例用法:
      //需要单个/第一个匹配:不使用全局修饰符并访问匹配[1]
      console.log(“我的奶牛总是产奶”).match(/cow(.*milk/)[1]);
      //多个匹配:使用全局修饰符和
      //如果前导/尾随分隔符的长度已知,则修剪结果
      var s=“我的奶牛总是产奶,他们的奶牛也产奶”;
      log(s.match(/cow(.*milk/g).map(函数(x){return x.substr(4,x.length-9);});
      //或者在循环中使用RegExp#exec收集所有组1内容
      var结果=[],m,rx=/奶牛(.*)牛奶/g;
      while((m=rx.exec))!==null){
      结果:push(m[1]);
      }
      
      console.log(result);
      使用下面的Martinho Fernandes解决方案,我能够得到我需要的东西。代码是:

      var test = "My cow always gives milk";
      
      var testRE = test.match("cow(.*)milk");
      alert(testRE[1]);
      
      您会注意到,我正在以数组的形式通知testRE变量。这是因为出于某种原因,testRE正在以数组的形式返回。来自:

      My cow always gives milk
      
      更改为:

      always gives
      

      选择的答案对我不起作用…嗯

      只需在奶牛之后和/或牛奶之前添加空格,即可从“总是给予”中删除空格

      /(?方法match()在字符串中搜索匹配项并返回数组对象

      // Original string
      var str = "My cow always gives milk";
      
      // Using index [0] would return<br/>
      // "**cow always gives milk**"
      str.match(/cow(.*)milk/)**[0]**
      
      
      // Using index **[1]** would return
      // "**always gives**"
      str.match(/cow(.*)milk/)[1]
      
      //原始字符串
      var str=“我的奶牛总是产奶”;
      //使用索引[0]将返回
      //“**奶牛总是产奶**” str.match(/cow(.*)milk/)**[0]** //使用索引**[1]**将返回 //“**总是给予**” str.match(/cow(.*)milk/)[1]
      考虑到语法,我发现正则表达式非常乏味且耗时。由于您已经在使用javascript,因此在没有正则表达式的情况下,执行以下操作更容易:

      const text='我的奶牛总是产奶'
      const start=`cow`;
      const end=`milk`;
      常量middleText=text.split(开始)[1]。split(结束)[0]
      console.log(middleText)//打印“始终提供”
      
      任务 提取两个字符串之间的子字符串(不包括这两个字符串)

      解决方案
      let allText=“Lorem Ipsum只是印刷和排版行业的虚拟文本。Lorem Ipsum是行业标准的虚拟文本
      
      var test = "My cow always gives milk";
      
      var testRE = test.match("cow(.*)milk");
      alert(testRE[1]);
      
      My cow always gives milk
      
      always gives
      
      /(?<=cow ).*(?= milk)/
      
      // Original string
      var str = "My cow always gives milk";
      
      // Using index [0] would return<br/>
      // "**cow always gives milk**"
      str.match(/cow(.*)milk/)**[0]**
      
      
      // Using index **[1]** would return
      // "**always gives**"
      str.match(/cow(.*)milk/)[1]
      
      let allText = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum";
      let textBefore = "five centuries,";
      let textAfter = "electronic typesetting";
      var regExp = new RegExp(`(?<=${textBefore}\\s)(.+?)(?=\\s+${textAfter})`, "g");
      var results = regExp.exec(allText);
      if (results && results.length > 1) {
          console.log(results[0]);
      }
      
      /My cow ([\s\S]*)milk/gm
      
      My cow always gives 
      milk
      
      var str = "My cow always gives milk";
      var subStr = str.match("cow(.*)milk");
      console.log(subStr[1]);