【问题标题】:JScript regex - extract a substring between 2 words containing 1 or more occurrences of another wordJScript 正则表达式 - 提取包含 1 次或多次出现的另一个单词的 2 个单词之间的子字符串
【发布时间】:2017-11-02 17:09:48
【问题描述】:

我有一个从大型 PDF 文件中提取的文本。我只对本文的一部分感兴趣。我只需要存在于 2 个test 子字符串之间的部分,并且它有 1 次或多次出现特定单词 XX12QW。在这 2 个test 子字符串/单词中,第一个可以包含在匹配中,如下面所需的输出所示

输入字符串:

test 
abc def 
test 123 
test pqr 
XX12QW
jkl XX12QW hjas 
12asd23 test bxs

期望的输出:

test pqr 
XX12QW
jkl XX12QW hjas 
12asd23 

注意事项:

  • 子字符串test 多次出现。
  • 我只需要 2 个子字符串/单词之间的部分 - test,其中包含 1 次或多次出现的单词 XX12QW。这个词 XX12QW 根本不会出现在词 - test 的任何其他 之间。也就是说,永远不会有这样的情况:test abc XX12QW test isadkj XX12QW test an test
  • 如果XX12QW 出现在test$(End of string/file) 之间,则需要一个额外的测试用例:
    • 输入:test absjh123 sjnc test jhsd32 test aabb XX12QW asdj XX12QW sdfk
    • 所需输出:test aabb XX12QW asdj XX12QW sdfk

我在这个问题上卡了很长时间,真的需要其他人来看看。

正则表达式:test[\s\S]*?XX12QW[\s\S]*?(?=test)

非常感谢任何帮助。

【问题讨论】:

  • 假设 test 在以 open tag 之类的方式使用时始终是字符串中的第一个,您可以将 test(?!.*^test)(?=.*XX12QW).+(?=test)sm 修饰符一起使用,如 show @ 987654322@。另一种选择是使用.*(test(?=.*XX12QW).+(?=test)),它将结果存储到捕获组中,这将只匹配最后一次出现,所以假设你有多次出现,这将失败
  • @ctwheels 非常感谢。到目前为止看起来不错。你能把它作为答案发布吗?
  • 我相信解决这个问题的最好方法是使用test.+?(?=\s*test|$)(带有gs修饰符)然后检查哪些匹配项包含XX12QW
  • @Gurman 你有时间检查我的回答吗?如果没用,我就删了。

标签: javascript regex jscript


【解决方案1】:

纯正则表达式解决方案是可能的,但最好使用test 拆分并从数组中获取包含XX12QW 的项目并在开头附加test

var s = "test \nabc def \ntest 123 \ntest pqr \nXX12QW\njkl XX12QW hjas \n12asd23 test bxs";
var res = s.split('test').slice(1)   // Split with 'test' and remove 1st item
       .filter(function(x) {return ~x.indexOf("XX12QW");}) // Keep those with XX12QW
       .map(function(y) {return ("test"+y).trim();});  // Append test back and trim
console.log(res);

单个正则表达式解决方案可能看起来像

/test(?:(?!test)[^])*?XX12QW[^]*?(?=\s*test)/

regex demo

详情

  • test - 文字 test 子字符串
  • (?:(?!test)[^])*? - 一个 tempered greedy token 匹配任何字符,0+ 字符,尽可能少,除了那些以 test 字符序列开头的字符
  • XX12QW - 文字 XX12QW 子字符串
  • [^]*? - 任何 0+ 个字符,尽可能少,最多(不包括...)
  • (?=\s*test) - 0+ 个空格,后跟 test 子字符串。

【讨论】:

  • 这解决了我的问题。非常感谢您提供与缓和的贪婪令牌的链接。我不知道。今天学到了一个新东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-01
  • 2016-11-15
  • 2021-12-21
相关资源
最近更新 更多