javascript - 正则表达式负前瞻,不包括完整块
问题描述
我正在尝试组合一个正则表达式,它将从下面的字符串中提取我的表面,不包括以日文字符开头的值。
"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)
IE。以下字符串产生:81.95m2 和 0.9m2。我只需要 81.85 平方米。
"81.95m2(24.78坪)、うち2階車庫8.9m2"
您知道如何将以下负面展望块视为排除项吗?
谢谢
解决方案
如果前面有数字或数字+句点,您需要取消任何匹配。
(?<!\d)(?<!\d\.)
在第一个lookbehind之后或之前添加:
(?<![\u4E00-\u9FAF\u3040-\u3096\u30A1-\u30FA\uFF66-\uFF9D\u31F0-\u31FF])(?<!\d)(?<!\d\.)(\d+(?:\.\d+)?m2)
查看正则表达式演示
如果在当前位置的(?<!\d)
左侧有一个数字,则匹配失败,如果(?<!\d\.)
前面有一个数字和一个点,则匹配失败。
The\d+(?:\.\d+)?
是一种更精确的模式来匹配像30
or之类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
如果您打算在没有任何字母的情况下匹配它,请使用
- pcre java -
(?<![\p{L}\d]|\d\.)\d+(?:\.\d+)?m2
(也适用于 JS ES2018+ 环境/(?<![\p{L}\d]|\d\.)\d+(?:\.\d+)?m2/gu
:) - 蟒蛇-
(?<!\d\.)(?<![^\W_])\d+(?:\.\d+)?m2
请注意,您可以在之后添加\b
单词边界2
以确保其后或字符串末尾有一个非单词字符。
推荐阅读
- css - 比率 Wordpress 主题顶部栏信息不断下降
- java - 资源路径问题(Spring App 部署在 Tomcat 服务器上)
- reactjs - 我可以导出 ReactQuill 值吗?
- spring-boot - 不例外的百里香叶符号和不例外的值
- python - 如何使用 PyO3 构建混合 Python Rust 包
- javascript - 将电子邮件数据从一个 HTML 文件传输到另一个以“%40”而不是“@”显示的文件
- python - cudf 读取 csv 文件错误:字符串的总大小对于 cudf 列来说太大了
- c++ - CRTP 与模板专业化和标签调度
- rust - Serde 有条件地反序列化序列中的每个项目
- java - 使用选择排序对数组进行排序