Мне нужно вытащить текст из потока PDF в виде строки. Этот поток будет содержать как разметку для описания внешнего вида текста, так и самого текста. Строка, которую я получаю, чтобы мое регулярное выражение должно было работать, никогда не будет содержать никаких возвратов каретки или строк. Области текста, которые меня интересуют, всегда будут внутри скобок (и там, возможно, будут скобки в скобках), а после окончательной скобки будут буквы «Tj». Короче, что я после всегда будет следовать соглашению:regex, где скобки могут быть не сбалансированы
(.....) 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: Запрос дополнительной информации» из этого.
и вот пример случай, когда мое регулярное выражение будет неудачным (я добавил несбалансированную скобку):
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. Любая помощь приветствуется. Заранее спасибо.
--- ОБНОВЛЕНИЕ, чтобы ответить на следующие вопросы
Любого типа пользовательского ввода может быть размещен между открытой и закрывающей скобкой. Я хочу извлечь весь контент, как это было предусмотрено, хотя это может быть, даже если пользователь забыл сбалансировать свою скобку. Единственная гарантия заключается в том, что текст между скобками вводится пользователем, но, тем не менее, они вводят текст до них, поэтому он НЕ следует предопределенному формату, например ([аббревиатура]: [контент]) и т. Д. контент гарантированно будет только между открытыми parens, близкими parens, а после закрытия parens будут буквы Tj.
Выражения Regualr не могут обрабатывать произвольно вложенные круглые скобки. Язык совпадающих скобок сам по себе не является регулярным. – CollinD
Я не понял ваше регулярное выражение, однако, я играл с вашими примерами, и я думаю, что это выполнимо, хотя вам, возможно, придется сделать несколько поисков и заменить. В примере «(RE: Request for (Дополнительная информация)» вы можете извлечь «RE: Request for (Дополнительная информация)», заменив начало строки, за которой следует любое количество символов любого другого, кроме открытой круглой скобки, затем выполните пронумерованные save. Ключ в том, что. * получает БОЛЬШОЙ матч, поэтому он обходит первую открытую скобку (RE: ... и прокладывает путь до (Дополнительно ... Я посмотрю на это завтра). –
Кстати, в вашем примере случая, когда ваше регулярное выражение не будет выполнено, есть несколько совпадений. Будут ли все они находиться в одной строке или по одной в строке? –