我正在處理歷史文本,我想用 RegEx 重新格式化它。問題是:文本中有很多特殊字符(即:字母)與 RegEx 字符類(如 [az] / [AZ] 或 \w )不匹配。例如,我想匹配以下行中的點(并且僅匹配點):
<tag1>Quomodo restituendus locus Demosth. Ol?nth</tag1>
沒有 ? 我可以輕松地使用提到的字符類,例如:
(?<=(<tag1>(\w|\s)*))\.(?=((\w|\s)*</tag1>))
但它不適用于 ASCII 未涵蓋的特殊字符。我嘗試了很多東西,但我無法讓它作業,所以 RegEx 真的只捕獲了這一行中的點。如果我使用更通用的運算式,如 (.)* (而不是 (\w|\s)* ),我會在檔案中得到更多的點(例如,點不在開始和結束標記之間,而是在兩者之間兩個這樣的標簽集),這不是我想要的。對于涵蓋所有 unicode 字母的運算式有什么想法嗎?
uj5u.com熱心網友回復:
您可以匹配之間的任何文本<,并>用[^<>]*:
(?<=(<tag1>[^<>]*))\.(?=([^<>]*</tag1>))
請參閱正則運算式演示。不確定您是否需要所有這些捕獲組,如果沒有它們,您可能會得到所需的內容:
(?<=<tag1>[^<>]*)\.(?=[^<>]*</tag1>)
請參閱此正則運算式演示。詳情:
(?<=<tag1>[^<>]*)- 緊接在<tag1and之前的位置,然后是除<and之外的任何零個或多個字符>\.- 一個點(?=[^<>]*</tag1>)- 緊跟在除<and>和 then之外的零個或多個字符之前的位置</tag1>。
uj5u.com熱心網友回復:
使用排除點和左尖括號的否定字符類:
(?<=<tag1>[^.<]*(?:<(?!/tag1>)[^.<]*)*)\.
使用這種模式甚至不需要檢查結束標簽。但是,如果您絕對想檢查它,請以以下方式結束模式:
(?=[^<]*(?:<(?!/tag1>)[^<]*)*</tag1>)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/389288.html
