【问题标题】:How to parse text between lookbehind and lookahead如何在lookbehind和lookahead之间解析文本
【发布时间】:2019-11-24 16:58:38
【问题描述】:

我有以下文字。

您好,我叫 Adam(年龄:25),我住在美国。

你好,我叫比尔(23 岁),我住在亚洲。

我想从此文本中获取年龄和位置(前瞻和后瞻)。

输出应该是这样的。

["25, US", "23, Asia"]

这就是我走了多远。

(?<=age: ).*?(?=$)

通过 js 匹配函数,我得到了这个数组。

["25) I live in US.", "23) I live in Asia."]

我用[0-9a-zA-Z] 替换了.*?,但它似乎不起作用。

【问题讨论】:

  • 请注意并非所有浏览器都支持lookbehind。

标签: javascript regex


【解决方案1】:

也许,

.*\bage:\s*(\d+)\s*\) I live in (.+)\.

会更接近一点,其中有两个带有您想要的子字符串的捕获组。

测试

const regex = /.*\bage:\s*(\d+)\s*\) I live in (.+)\./gm;
const str = `Hello my name is Adam (age: 25) I live in US.
Hello my name is Bill (age: 23) I live in Asia.`;
const subst = `$1, $2`;

const result = str.replace(regex, subst);

console.log(result);

如果您希望简化/更新/探索表达式,已在regex101.com 的右上角面板中进行了说明。如果您有兴趣,可以在this debugger link 中观看匹配步骤或修改它们。调试器演示了a RegEx engine 如何逐步消耗一些示例输入字符串并执行匹配过程。


正则表达式电路

jex.im 可视化正则表达式:

【讨论】:

  • 不错 :) 根据您大约 2 个月前对我的问题的回答,我实际上正在研究一些类似的东西,哈哈。
  • 非常感谢您的回答。我有数百行,您的解决方案不适用于第一行和最后一行
【解决方案2】:

您的问题要求正则表达式使用 lookbehindlookahead。坦率地说,在这种情况下并没有真正需要这样做,并且已经提到并非所有浏览器都可能支持 lookbehind。但是,如果您想看看它的外观,这里是:

/^.*?(?<=age: )(\d+).*?(?<=I live in )([^.]+)(?=\.$).*?$/gm
  1. ^ 匹配行首。
  2. .*? 0 个或多个字符的最小匹配,直到:
  3. (?&lt;=age: )(\d+) 匹配以 'age: ' 开头的 1 个或多个数字(您可以将其设为 (?&lt;=age: +) 以允许数字前有多个空格)。
  4. .*? 0 个或多个字符的最小匹配,直到:
  5. (?&lt;=I live in )([^.]+)(?=\.$) 匹配 1 个或多个非句点字符,这些字符前面是字符串 'I live in ',后面是句点和行尾。
  6. .*?$ 匹配剩余的字符,直到行尾(这将只是一个句点)。

let s = `Hello my name is Adam (age: 25) I live in US.

Hello my name is Bill (age: 23) I live in Asia.`;

let regex = /^.*?(?<=age: )(\d+).*?(?<=I live in )([^.]+)(?=\.$).*?$/gm;
let result = s.replace(regex, `$1, $2`);
console.log(result);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-18
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多