[英]Match the same start and end character of a string with Regex
我試圖將字符串的開始和結束字符匹配為相同的元音。 我的正則表達式適用於大多數情況,但在其他情況下失敗:
var re = /([aeiou]).*\1/;
re.test(str);
樣本輸入:
abcde
,輸出 - 假(有效)abcda
,輸出 - 真(有效)aabcdaa
,輸出 - 真(有效)aeqwae
,輸出 - 真(無效)ouqweru
,輸出 - 真(無效)您需要在字符串中添加錨點。
當你有,例如:
aeqwae
您說輸出為真,但它無效,因為a
與e
。 好吧,正則表達式只是匹配前一個字符(在e
之前),即a
。 因此,匹配是有效的。 所以,你得到這個:
[aeqwa]e
括號中的字符串是實際匹配項以及它返回true
。
如果您將正則表達式更改為:
/^([aeiou]).*\1$/
通過添加^
,你告訴它匹配的開始必須是字符串的開始,通過添加$
你告訴它匹配的結束必須是字符串的結束。 這樣,如果有匹配項,則必須匹配整個字符串,這意味着aeqwae
將不再匹配。
測試正則表達式的一個很好的工具是Regex101 。 試試看!
注意:根據您的輸入,您可能需要設置全局 (g) 或多行 (m) 標志。 全局標志可防止正則表達式在第一次匹配后返回。 多行標志,使^
和$
行(而不是字符串)的開始和結束匹配。 在使用您的輸入進行測試時,我同時使用了它們。
只是一個不同版本的@Hristiyan Dodov 回答,我是為了好玩而寫的。
regex = /^(a|e|i|o|u).*\\1$/ const strings = ['abcde', 'abcda', 'aabcdaa', 'aeqwae', 'ouqweru'] strings.forEach((e)=>{ const result = regex.test(e) console.log(e, result) })
上面已經提到了正確答案,只是為了進一步澄清:
regEx= /^([a,e,i,o,u])(.*)\1$/
這里, \\1
是再次匹配相同文本的反向引用,您可以多次重復使用相同的反向引用。 大多數正則表達式支持多達 99 個捕獲組和兩位數的反向引用。 所以 \\99 是一個有效的反向引用,如果你的正則表達式有 99 個捕獲組。 訪問詳細信息
/^([aeiou])[a-z]\1$/
只是一點點改進,以捕捉字母。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.