![](/img/trans.png)
[英]Regex match if certain string is contained after last occurrence of specific character
[英]Use regex to match certain number of lines that follow the line containing the occurrence of a specific string
我在InDesign中工作,用於格式化大量文本。 這是文本的示例。
新! Office Operations證書(共3部分)
辦公室運作
經理人的網絡安全
擁抱工作場所的可持續發展
3D打印簡介
Maker Tech簡介:新商店類
我需要能夠匹配包含字符串“(3 parts)”的三行。
我的想法是像這樣嘗試積極的眼光:
(?<=\(3 parts\)$)^.*$
但沒有任何匹配。
后面的部分是正確的,但是符號^
(開始段落)和$
(結束段落)的使用僅限於與位置匹配,而不是實際的“硬回車”字符。 這就是您的表達式失敗的原因:默認情況下, .
“全部匹配”字符與返回值不匹配。 這樣就進行了第一個測試(?<=\\(3 parts\\)$)^.
失敗:后面的$
和^
沒有消耗返回值,而后面的.
根據此默認規則,它也不匹配。
可以將GREP置於“單行”模式-一個有趣的描述,可能會使您陷入錯誤的境地。 從GREP的角度來看,它允許.
也要匹配回報; 因此整個運行文本,辛苦的回報以及所有的一切都可以視為“單(長)行”。 該代碼是(?s)
,通常放在表達式的最前面。
這本身不足以使其發揮作用,因為
(?s)(?<=\(3 parts\)$)^.
仍然期望$
和^
之間有回報(否則,任何一個都將是錯誤的!)。 無論如何,這不是匹配一定數量段落的好方法。 調整后的表達式
(?s)(?<=\(3 parts\)$).^.*
在消耗高額回報上可以正常工作,但也可以選擇所有內容,直到最后。
我提出了一種更為簡單的方法:如果您想獲得一定數量的硬性回報,只需立即將它們包括在表達式中即可-它們的GREP代碼為\\r
。
這導致以下結果:
(?<=\(3 parts\)\r)(.*\r){3}
后面的內容是您已經獲得的內容,外加返回以結束該特定行(並且它在后面,因為您也不想抓住該返回值),然后是序列的三個重復,以獲取整個行, .*\\r
。
這適合您嗎?
\Q(3 parts)\E\r((?:.*$\R){3})
參見regex101.com上的演示 。 正如@Jongware指出的那樣,在Adobe InDesign中似乎是\\r
(小寫)。
您可以在grep
使用-A
選項:
grep -A 3 -F '(3 parts)' file
NEW! Certificate in Office Operations (3 parts)
Office Operations
Cyber Security for Managers
Embracing Sustainability in the Workplace
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.