簡體   English   中英

使用正則表達式匹配包含特定字符串的行之后的特定行數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM