javascript - 正则表达式负向预测不包括整个 block

标签 javascript regex regex-lookarounds

我正在尝试组合一个正则表达式,它可以从下面的字符串中提取表面,不包括前面带有日语字符的值。

"110.94m2・129.24m2"; --> 110.94m2 and 129.24m2
"81.95m2(24.78坪)、うち2階車庫8.9m2" --> 81.95m2
"80.93m2(登記)" --> 80.93m2
"93.42m2・93.85m2(登記)" --> 93.42m2 and 93.85m2
"81.82m2(実測)" --> 81.82m2
"81.82m2(実測)、うち1階車庫7.82m2" --> 81.82m2
"90.11m2(実測)、うち1階車庫8.07m2" --> 90.11m2

到目前为止,我已经整理了以下正则表达式,但并非在所有情况下都有效。

(?<![\u4E00-\u9FAF\u3040-\u3096\u30A1-\u30FA\uFF66-\uFF9D\u31F0-\u31FF])([0-9\.]*m2)

即。以下字符串得出:81.95m2 和 0.9m2。我只需要 81.85 平方米。

"81.95m2(24.78坪)、うち2階車庫8.9m2"

您知道如何将以下否定前瞻 block 视为排除项吗?

谢谢

最佳答案

如果前面有数字或数字+句点,则需要取消任何匹配。

添加(?<!\d)(?<!\d\.)在第一次回顾之后或之前:

(?<![\u4E00-\u9FAF\u3040-\u3096\u30A1-\u30FA\uFF66-\uFF9D\u31F0-\u31FF])(?<!\d)(?<!\d\.)(\d+(?:\.\d+)?m2)

请参阅regex demo

(?<!\d)是一个负向后查找,如果当前位置和 (?<!\d\.) 左侧紧邻一个数字,则匹配失败当前面有一个数字和一个点时失败。

\d+(?:\.\d+)?是一个更精确的模式来匹配像 30 这样的数字或30.5678 :1 个或多个数字后跟可选序列 .和 1+ 位数字。

注意,此正则表达式仅适用于 ES2018+ JS 环境(Chrome、Node)。您可以将一个可选的日语字符捕获到第 1 组中,将数字捕获到第 2 组中,然后检查第 1 组是否匹配,如果匹配,则匹配失败,否则,获取第 2 组。

正则表达式是

/([\u4E00-\u9FAF\u3040-\u3096\u30A1-\u30FA\uFF66-\uFF9D\u31F0-\u31FF])?(\d+(?:\.\d+)?m2)/g

请参阅下面的使用示例。

JS ES2018+ 演示:

const lst = ["110.94m2・129.24m2", "81.95m2(24.78坪)、うち2階車庫8.9m2", "80.93m2(登記)", "93.42m2・93.85m2(登記)", "81.82m2(実測)" , "81.82m2(実測)、うち1階車庫7.82m2", "90.11m2(実測)、うち1階車庫8.07m2"];
const regex = /(?<![\u4E00-\u9FAF\u3040-\u3096\u30A1-\u30FA\uFF66-\uFF9D\u31F0-\u31FF])(?<!\d)(?<!\d\.)(\d+(?:\.\d+)?m2)/g;
lst.forEach( s => 
  console.log( s, '=>', s.match(regex) )
);
console.log("Another approach:");
lst.forEach( s => 
  console.log(s, '=>', s.match(/(?<![\p{L}\d]|\d\.)\d+(?:\.\d+)?m2/gu))
)

JS 旧版 ES 版本:

var lst = ["110.94m2・129.24m2", "81.95m2(24.78坪)、うち2階車庫8.9m2", "80.93m2(登記)", "93.42m2・93.85m2(登記)", "81.82m2(実測)" , "81.82m2(実測)、うち1階車庫7.82m2", "90.11m2(実測)、うち1階車庫8.07m2"];
var regex = /([\u4E00-\u9FAF\u3040-\u3096\u30A1-\u30FA\uFF66-\uFF9D\u31F0-\u31FF])?(\d+(?:\.\d+)?m2)/g;
for (var i=0; i<lst.length; i++) {
  var m, res =[];
  while (m = regex.exec(lst[i])) {
    if (m[1] === undefined) {
      res.push(m[2]);
    }
  }
  console.log( lst[i], '=>', res );
}

变化

如果您打算将浮点/整数与 m2 匹配在它之后仅前面有空格或在字符串的开头使用

(?<!\S)\d+(?:\.\d+)?m2

如果您打算在前面没有任何字母时进行匹配

  • -(?<![\p{L}\d]|\d\.)\d+(?:\.\d+)?m2 (也适用于 JS ES2018+ 环境: /(?<![\p{L}\d]|\d\.)\d+(?:\.\d+)?m2/gu )
  • -(?<!\d\.)(?<![^\W_])\d+(?:\.\d+)?m2

请注意,您可以添加 \b 2 之后的字边界确保其后面或字符串末尾有一个非单词字符。

关于javascript - 正则表达式负向预测不包括整个 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57817949/

相关文章:

regex - 用于 2 个用户名的 TortoiseGit 过滤器

javascript - 如果前面没有反斜杠,如何匹配粗体 Markdown ?

javascript - 正则表达式优化和最佳实践

regex - 如何使用正则表达式解析可变长度命令行参数?

javascript - 使用 Lodash 从对象中删除字段

javascript - 可按下按钮代码不起作用

javascript - 当我只需要其中的 Checkbox 的 ng-click 时,如何不触发 TR 的 ng-click

javascript - JavaScript 和/或 Node.js 中用于验证目的的正则表达式

javascript - 如何在页面加载开始时启动多个 http 请求?

regex - VBA - 带有变量的正则表达式拆分