簡體   English   中英

括號可能不平衡的正則表達式

[英]regex where parenthesis might not be balanced

我必須將一些文本作為字符串從PDF流中提取出來。 此流將包含描述文本外觀的標記和文本本身。 我收到的正則表達式必須在其上運行的字符串將永遠不會包含任何回車符或換行符。 我感興趣的文本區域將始終在括號內(並且括號內可能會有括號),最后的括號后將出現字母“ Tj”。 簡而言之,我追求的將始終遵循慣例:

(.....) Tj

目前,只要括號之間的平衡,我使用的正則表達式就可以正常工作:

\((?:[^()]|(?'paren'\()|(?'-paren'\)))+(?(paren)(?!))\)

但是,如果文本本身包含不平衡的括號,則此正則表達式將無法實現我想要的功能,並且我不確定如何更改它以能夠處理不平衡的括號。

以下是被視為“正常”字符串的示例:

q  Q  /Tx BMC  q  0 0 471.34 407.34 re  W  n  BT  1 0 0 1 2 397.16 Tm  /Helv 12 Tf  0 g  (RE:  Request for Additional Information) Tj

所以很明顯,我想從中得到字符串“ RE:Request for Additional Information”。

這是一個例子,我的正則表達式將失敗(我添加了不平衡的括號):

q  Q  /Tx BMC  q  0 0 471.34 407.34 re  W  n  BT  1 0 0 1 2 397.16 Tm  /Helv 12 Tf  0 g  (RE:  Request for (Additional Information) Tj 0 g  1 0 0 1 2 383.29 Tm  0 g  (     13. Processing TT Instructions -) Audit Note 12) Tj  0 g  1 0 0 1 2 369.42 Tm  0 g  () Tj  0 g  1 0 0 1 2 355.55 Tm  0 g  (Dear test:) Tj  0 g  1 0 0 1 2 341.68 Tm  0 g  () Tj  0 g  1 0 0 1 2 327.8 Tm  0 g  (Thank you for the more random words here.  )Unfortunately, more words here) terminating (words here) Tj  

這里也有空括號,如下所示:

() Tj

這些代表呈現PDF時的回車和換行符。 任何幫助表示贊賞。 先感謝您。

---更新以回答以下問題

任何類型的用戶輸入都可以放在左括號和右括號之間。 我想提取所提供的所有內容,但是即使用戶忘記平衡括號也是如此。 唯一的保證是括號之間的文本是用戶輸入的,但是他們輸入的文本取決於他們,因此它不遵循([abbrev]:[content])等預定義格式。僅保證在開放式括號,封閉式括號之間,並且在封閉式括號之后將是字母“ Tj”。

正如我在評論中提到的那樣,.NET無法幫到您,但是我可以給您一個可能有用的表達式。 我認為該解決方案需要“負前瞻”,而perl提供了這一點。 問題是我已經很久沒有使用過perl了,我忘記了如何使它進入整個流程。 如果我將流分成“(...)Tj”大塊,每個大塊都放在單獨的行中,則我的腳本將在您的所有示例中運行:

$ cat pdf_data_line_by_line.txt
q  Q  /Tx BMC  q  0 0 471.34 407.34 re  W  n  BT  1 0 0 1 2 397.16 Tm  /Helv 12 Tf  0 g  (RE:  Request for Additional Information) Tj
q  Q  /Tx BMC  q  0 0 471.34 407.34 re  W  n  BT  1 0 0 1 2 397.16 Tm  /Helv 12 Tf  0 g  (RE:  Request for (Additional Information) Tj
0 g  1 0 0 1 2 383.29 Tm  0 g  (     13. Processing TT Instructions -) Audit Note 12) Tj
0 g  1 0 0 1 2 369.42 Tm  0 g  () Tj
0 g  1 0 0 1 2 355.55 Tm  0 g  (Dear test:) Tj
0 g  1 0 0 1 2 341.68 Tm  0 g  () Tj
0 g  1 0 0 1 2 327.8 Tm  0 g  (Thank you for the more random words here.  )Unfortunately, more words here) terminating (words here) Tj
$ cat get_pdf_text.pl
#!/usr/bin/perl
while (<>) {
   # find some text
   if ( /[^(]*\((?!\)).*\) Tj/ ) {
      # strip off leading junk
      s/[^(]*\((?!\))[ ]*([^)].*)\) Tj/$1/;
      # output saved part of match
      print $_;
      print "YOUR DELIMITER HERE\n";
   }
}
$ cat pdf_data_line_by_line.txt | ./get_pdf_text.pl
RE:  Request for Additional Information
YOUR DELIMITER HERE
RE:  Request for (Additional Information
YOUR DELIMITER HERE
13. Processing TT Instructions -) Audit Note 12
YOUR DELIMITER HERE
Dear test:
YOUR DELIMITER HERE
Thank you for the more random words here.  )Unfortunately, more words here) terminating (words here
YOUR DELIMITER HERE

但是,如果我將示例合並為一個流,它將在第一個流之后停止。 我嘗試在's'命令的末尾使用“ g”,但沒有幫助:

$ cat pdf_data_single_stream.txt
q  Q  /Tx BMC  q  0 0 471.34 407.34 re  W  n  BT  1 0 0 1 2 397.16 Tm  /Helv 12 Tf  0 g  (RE:  Request for (Additional Information) Tj 0 g  1 0 0 1 2 383.29 Tm  0 g  (     13. Processing TT Instructions -) Audit Note 12) Tj 0 g  1 0 0 1 2 369.42 Tm  0 g  () Tj  0 g  1 0 0 1 2 355.55 Tm  0 g  (Dear test:) Tj 0 g  1 0 0 1 2 341.68 Tm  0 g  () Tj  0 g  1 0 0 1 2 327.8 Tm  0 g  (Thank you for the more random words here.  )Unfortunately, more words here) terminating (words here) Tj
$ cat pdf_data_single_stream.txt | ./get_pdf_text.pl
RE:  Request for (Additional Information) Tj 0 g  1 0 0 1 2 383.29 Tm  0 g  (     13. Processing TT Instructions -) Audit Note 12) Tj 0 g  1 0 0 1 2 369.42 Tm  0 g  () Tj  0 g  1 0 0 1 2 355.55 Tm  0 g  (Dear test:) Tj 0 g  1 0 0 1 2 341.68 Tm  0 g  () Tj  0 g  1 0 0 1 2 327.8 Tm  0 g  (Thank you for the more random words here.  )Unfortunately, more words here) terminating (words here
YOUR DELIMITER HERE

替換字符串...

s/[^(]*\((?!\))[ ]*([^)].*)\) Tj/$1/

...執行以下操作:查找零個或多個不是'('的字符,然后是單個'(',然后是')'(這是您需要否定前瞻的地方,這消除了'() Tj'的情況下),后跟零個或多個空格,然后記住{如果不是')'的后跟一個字符,如果后面有')Tj',則記住零個或多個后跟字符,然后用記住的字符串。 如果有人可以建議(可能非常簡單)的方法來使腳本一直通過流,那么那應該可以解決當前的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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