正则表达式无法在Angular模板中按预期工作

时间:2019-11-18 20:25:41

标签: regex angular2-template angular8

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

输入字符串:

  1. 酒店位置住在迪拜德拉(Deira)的Al Buraq酒店,只需几分钟便能到达黄金市场和香料市场。这家酒店距离迪拜购物中心(Dubai Mall)8.6英里(13.9公里),距离中心9英里(14.5公里)。

  2. 阿联酋购物中心和迪拜滑雪道。这家酒店距离赛马场9.1英里(14.6公里)。

预期的输出字符串:

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

实际输出字符串:

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

下面是我的代码

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测试了此正则表达式,并且效果很好。

2 个答案:

答案 0 :(得分:3)

模式from(.*?)((.)|(?=and))的这部分与 from 相匹配,然后至少与任何字符匹配.*?,然后使用点(.)匹配任何字符或|使用肯定的前瞻(?=and)

断言右边的是

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

您可以使比赛更具体:

\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

答案 1 :(得分:2)

您应该使用非贪婪匹配在第一个 处停止:

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."