正则表达式负前瞻,不包括完整块

时间:2019-09-06 07:59:48

标签: 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和.9m2。我只需要81.85平方米。

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

您知道如何将负面的前瞻性看法视为一种排斥吗?

谢谢

1 个答案:

答案 0 :(得分:2)

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

在第一个后视之后或之前添加(?<!\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个或多个数字,后跟/([\u4E00-\u9FAF\u3040-\u3096\u30A1-\u30FA\uFF66-\uFF9D\u31F0-\u31FF])?(\d+(?:\.\d+)?m2)/g 和1+个可选数字序列。

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

正则表达式为

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 ES2018 +演示:

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 );
}

JS旧版ES版本:

m2

变化

如果您打算将浮点数/整数与后跟(?<!\S)\d+(?:\.\d+)?m2 的浮点数/整数进行匹配,该数字仅以空格开头或在字符串开头使用

(?<![\p{L}\d]|\d\.)\d+(?:\.\d+)?m2

如果您打算在不使用任何字母的情况下进行匹配

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

请注意,您可以在2之后添加 $assessment = Assessment::with(['questionnaires'=>function($qstnr){$qstnr->whereNull('deleted_at');}]) ->with(['questionnaires.question_groups'=>function($group){$group->whereNull('deleted_at');}]) ->where('assessment.admission_id', $admissionId) ->orderBy('assessment.day_in_unit','desc') ->first(); if($assessment){ $assessment = $assessment->toArray(); } 单词边界,以确保在其后或字符串末尾有非单词char。