4 回答
TA贡献1829条经验 获得超7个赞
关于图案
该部分
Rm. 2301, Blk. B3-B4,
不匹配,因为您尝试的模式的最后部分有.\w+
模式
Rm
在交替中匹配,.
模式中的 也可以匹配字符串中的点,但后面有一个空格Rm.
,后面的 不会匹配\w
。在这部分中,
Flat/Room 5
由于相同的机制,空格和 5 不匹配。Flat
在交替中匹配,.
模式中的 匹配/
和\w+
匹配Room
,但是(-|&)?\w*
模式中的这部分与其后面的空格不匹配。
由于所有示例字符串都匹配到逗号之前,因此一种选择是匹配除逗号之外的所有后续字符串。
这是一个更广泛的匹配,但它可能会阻止创建更复杂的模式来解释所有变化。
\b(?:Units?|Shops?|Offices?|Flats?|Rm|Rooms?|Suites?)[^,\r\n]+
请注意,您可以将这样的部分更改(p|ps)
为匹配 ap
后跟一个可选s
并删除该组。
TA贡献1798条经验 获得超7个赞
...更通用但仍然足够具体的东西怎么样,例如... /^[\w./]+\s+[\w&-]+/
..?
毕竟有通用模式,两个空格分隔的字符序列,可以按如下方式匹配......
^[\w./]+\s+
...从一开始就匹配至少一个单词、点或斜杠字符的任何内容,直到到达包含空格(序列) ...[\w&-]+
...然后匹配对任何至少是单词、与号或减号字符的内容进行连续匹配。
console.log(
`Rm. 2301, Blk. B3-B4,
Flat/Room 5, 9/F,
rm A, 17/F.,
Flat F, 9/F,
Flat G1, 10/F,
Flat C, 36/F, Block 1,
Flat 1107&1108, 11/F,
Flat 2301, 23/F, F
Unit 3, 2/F, L
Unit 1603 16/F
Offices D-F, 23/F,
Office D-F, 23/F,
Unit 1901, 19/F,
Units A, 6/F,
Shop 14, G/F,
Rooms 2202,
Suite 702, 7/F.,`.match(/^[\w./]+\s+[\w&-]+/gm));
.as-console-wrapper { min-height: 100%!important; top: 0; }
TA贡献1820条经验 获得超9个赞
由于Rm. 2301
包含句点和空格,因此正则表达式的这部分将不匹配:
.\w
要修复此问题,您可以使用加号运算符 ( +
),使其匹配句点和空格。为了防止将捕获扩展到行尾,您还可以使用惰性运算符 ( ?
)。
.+?\w
所以最终的正则表达式将是:
/(Uni(t|ts)|Sho(p|ps)|Offic(e|es)|Fla(t|ts)?|Rm|Roo(m|ms)|Suit(e|es)).+?\w+(-|&)?\w*/
TA贡献1803条经验 获得超3个赞
也许更具可读性的正则表达式是这样的:
/(Flat\/Room|Flat|Suite|Rooms|Rm\.|Rm|Shop|Units|Unit|Offices|Office) ([\w&-]+)/gmi
它捕获第 1 组内的房间类型以及第 2 组中它旁边的数字(以及逗号之前)。
解释:
(A|B|C)
:将在组 1 中捕获A
,B
或者C
。([\w&-]+)
:将在组 2 中捕获字母数字 或&
或-
,任意次数。
演示: https: //regex101.com/r/Sc1Feg/5
添加回答
举报