我遇到了這個 Hackerrank 問題,正則表達式應該匹配 HTML 標簽之間的字符串。正則表達式和字符串是String str="<h1>Hello World!</h1>";String regex="<(.+)>([^<]+)</\\1>";另外,如果“str”有多個類似的 HTML 標簽,String str="<h1><h1>Hello World!</h1></h1>"以及如何([^<]+)捕獲這個“str”,該怎么辦。我的問題是如何([^<]+)匹配 'str' 而不是([a-zA-Z]+)。如果完整的源代碼在這里:import java.util.regex.Matcher;import java.util.regex.Pattern;/* Solution assumes we can't have the symbol "<" as text between tags */public class Solution{ public static void main(String[] args){ Scanner scan = new Scanner(System.in); int testCases = Integer.parseInt(scan.nextLine()); while (testCases-- > 0) { String line = scan.nextLine(); boolean matchFound = false; Pattern r = Pattern.compile(regex); Matcher m = r.matcher(line); while (m.find()) { System.out.println(m.group(2)); matchFound = true; } if ( ! matchFound) { System.out.println("None"); } } }}不要介意我是否愚蠢地問這個問題并提前謝謝你!
2 回答

紅糖糍粑
TA貢獻1815條經驗 獲得超6個贊
這個正則表達式保證你的字符串只包含一個標簽,假設 HTML 輸入格式良好。
首字母<(.+)>
捕獲您的標簽的名稱。捕獲組還將獲得它可以獲得的任何屬性。由于+
是一個貪婪的量詞,如果可以的話,它將捕獲多個標簽。
尾隨</\\1>
與第一組捕獲的任何內容相匹配。這就是為什么如果您的 HTML 格式正確,則表達式不會捕獲多個標簽或帶有屬性的標簽:
開始標簽
<h1>
,結束標簽</h1>
?開始標簽
<h1 attr="value">
,結束標簽</h1>
,但期待</h1 attr="value">
開始標簽
<h1><h2>
,結束標簽</h2></h1>
,但期待</h1><h2>
這就是為什么標簽可以.+
相當安全地匹配,而內容必須匹配[^<]+
。您要確保不抓取內容中的任何停留標簽,但允許使用任何其他字符。[^<]+
(發音。“不<
,至少一次)允許類似的事情!
,但[A-za-z]
肯定不會。

繁華開滿天機
TA貢獻1816條經驗 獲得超4個贊
如果輸入字符串是,Hello World!
則([a-zA-z]+)
由于感嘆號 (!) 和空格字符而無法正確匹配。
更清楚地說,這是每個正則表達式的含義:
([a-zA-Z]+)
匹配由字母(大寫或小寫)組成的序列(1 個或多個字符)([^<]+)
只要字符不是< 字符,就匹配一個序列(1 個或多個字符)
添加回答
舉報
0/150
提交
取消