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
添加回答
舉報