正则表达式在 Angular 模板中没有按预期工作
Regex doesn't work as expected in Angular Template
我正在尝试使用正则表达式从字符串中提取特定的句子。
输入字符串:
属性 位置 布拉格酒店位于迪拜德伊勒,距离黄金市场和香料市场仅数步之遥。此酒店距离迪拜购物中心 8.6 英里(13.9 公里),距离购物中心 9 英里(14.5 公里)。
阿联酋购物中心步行道和滑雪场 Dubai.This酒店距离 Race 14.6 公里(9.1 英里)。
预期输出字符串:
- 此酒店距离迪拜购物中心 13.9 公里(8.6 英里)
- 此酒店距离赛斯 14.6 公里(9.1 英里)。
实际输出字符串:
- 此酒店距离
13.9 公里(8.6 英里)
- 此酒店距离
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
或字符串结尾
您应该使用非贪婪匹配在第一个 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."
我正在尝试使用正则表达式从字符串中提取特定的句子。
输入字符串:
属性 位置 布拉格酒店位于迪拜德伊勒,距离黄金市场和香料市场仅数步之遥。此酒店距离迪拜购物中心 8.6 英里(13.9 公里),距离购物中心 9 英里(14.5 公里)。
阿联酋购物中心步行道和滑雪场 Dubai.This酒店距离 Race 14.6 公里(9.1 英里)。
预期输出字符串:
- 此酒店距离迪拜购物中心 13.9 公里(8.6 英里)
- 此酒店距离赛斯 14.6 公里(9.1 英里)。
实际输出字符串:
- 此酒店距离 13.9 公里(8.6 英里)
- 此酒店距离 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
或字符串结尾
您应该使用非贪婪匹配在第一个 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."