正则表达式在 Angular 模板中没有按预期工作

Regex doesn't work as expected in Angular Template

我正在尝试使用正则表达式从字符串中提取特定的句子。

输入字符串:

  1. 属性 位置 布拉格酒店位于迪拜德伊勒,距离黄金市场和香料市场仅数步之遥。此酒店距离迪拜购物中心 8.6 英里(13.9 公里),距离购物中心 9 英里(14.5 公里)。

  2. 阿联酋购物中心步行道和滑雪场 Dubai.This酒店距离 Race 14.6 公里(9.1 英里)。

预期输出字符串:

  1. 此酒店距离迪拜购物中心 13.9 公里(8.6 英里)
  2. 此酒店距离赛斯 14.6 公里(9.1 英里)。

实际输出字符串:

  1. 此酒店距离
  2. 13.9 公里(8.6 英里)
  3. 此酒店距离
  4. 14.6 公里(9.1 英里)

下面是我的代码

component.ts

regex = /This(.*)hotel(.*)from(.*?)((.)|(?=and))/;
// regex = new RegExp('This(.*)hotel(.*)from(.*?)((.)|(?=and))') 

template.html

<div>
    {{hotel.HotelInfo.HotelDescription.match(regex)?hotel.HotelInfo.HotelDescription.match(regex)[0]:null}}
</div>

我已经使用 this website 测试了这个正则表达式,它工作正常。

模式的这一部分 from(.*?)((.)|(?=and)) 匹配 from,然后尽可能少地匹配任何字符 .*? 然后使用点匹配任何字符(.)| 断言右边的是 使用正面前瞻 (?=and)

在这两种情况下,from 的右侧都有一个字符,因此将匹配它。

您可以使匹配更具体:

\bThis hotel is \d+(?:\.\d+)? mi \(\d+(?:\.\d+)? km\) from .*?(?= and|$)

部分模式

  • \bThis hotel is 字面匹配
  • \d+(?:\.\d+)? 匹配 1+ 个带可选小数部分的数字
  • mi 字面匹配
  • \( 匹配 (
  • \d+(?:\.\d+)?
  • km) from 字面匹配
  • .*? 匹配除换行符之外的任何字符非贪婪
  • (?= and|$) 正向前瞻,断言右边是 and 或字符串结尾

Regex demo

您应该使用非贪婪匹配在第一个 from:

处停止
This.*hotel.*?from.*?(?= and|$)

.*from 匹配最长的可能文本:is 8.6 mi (13.9 km) from Dubai Mall and 9 mi (14.5 km) from.

每个部分属于这些文本:

This            "This"                    "This"
.*              " "                       " "
hotel           "hotel"                   "hotel"
.*?             " is 8.6 mi (13.9 km) "   " is 9.1 mi (14.6 km) "
from            "from"                    "from"
.*?(?= and|$)   " Dubai Mall"             " Race."