2017-04-10 353 views
-2

我正在使用Java正則表達式包:java.util.regex的Pentaho上工作。正則表達式 - 忽略字符串的一部分

我想從一個文本文件中的行提取了大量的信息,從雙方開始和結束的字符串:

^StartofString Controls\(param1="(D[0-9]{0,})",param2="(G[0-9]{0,})",param3="([^"]{0,})",param4="([^"]{0,})"\):(?:.*)param5="([^"]{0,})",.* 

有串長部分我想忽略,並嘗試與(?:.*)

積極的超前看起來似乎工作,當我在步驟上測試正則表達式,但在執行轉換時不起作用。 我測試上「正則表達式評價」步驟的字符串,「過濾器的行」前一步驟和提取物組的一個Javascript步驟內的布爾檢查:

var pattern = Packages.java.util.regex.Pattern.compile(patternStr); 
var matcher = pattern.matcher(content.toString()); 
var matchFound = matcher.find(); 

與patterStr是相同的正則表達式一個比在'正則表達式評估'的步驟,但與逃逸字符:\

我已經閱讀了很多關於忽略正則表達式字符串的部分問題,仍然無法找到答案。 歡迎任何幫助。 如果需要,我可以提供更多信息。

+3

不知道你的問題是。有一點是肯定的:'(?:。*)'是一個非捕獲組,不是前瞻。 –

+0

我們可以看到轉換代碼嗎?使用非捕獲組本身並不能解決問題:非捕獲組意味着沒有捕獲組,但匹配的文本仍然存在於輸出中;只是不在一個組 – Aaron

+0

...我混淆了非捕獲組和前瞻。我想要的是在捕捉到字符串的大部分之前,直到達到參數5。 不知道如何看待完整的轉型會有所幫助,而且我不應該顯示明智的信息。 – v01dv01d

回答

1

非捕獲組並不意味着它的內容不會被捕獲,這意味着它不會被捕獲到一個組中(儘管您仍然在您的正則表達式中分組令牌,這對於一次對他們應用修飾符)。

例如,這些正則表達式都將匹配完全相同的abc字符串:

abc 
a(?:b)c 
a(b)c 

然而,在第三種情況下,你已經定義了一個捕獲組,這將使你能夠獨立訪問b。前兩種情況在各方面都是平等的。

當您希望將修飾符應用於一組標記而不需要稍後可以參考的額外組時,非捕獲組將變得有用。下面regexs都將匹配相同的字符串:

(ab)*(c)\2 
(?:ab)*(c)\1 

我們想申請*ab令牌。要麼我們用一個捕獲組來做(第一個例子),並且創建一個我們可以參考的組,或者我們使用一個非捕獲組。正則表達式末尾的反向引用應該與c匹配;在第一個例子中,它是第二個組,因爲ab是第一個,而第二個c是第一個可以引用的組。

現在我已經解釋了非捕獲組所做的事情,讓我們來解決你的問題:你想從字符串的中間去掉某些東西,你知道什麼是開始和結束。

讓我們假設你想匹配字符串如下:

Aremove-thisB 

而且你想要的結果AB

有多種策略,這樣做,你的情況最簡單的可能是字符串的都開始和結束自己的捕獲組匹配,並從那裏創建你的輸出:

var pattern = Packages.java.util.regex.Pattern.compile("(A).*(B)"); 
var matcher = pattern.matcher(content.toString()); 
var matchFound = matcher.find(); 
if (matchFound) { return matcher.group(1) + matcher.group(2); } 
+0

感謝您的精確答案,但它仍然不能完全回答我的問題。 我想要匹配的字符串看起來更像 'A = text1,remove-this,B = text2' 我想單獨捕獲text1和text2 – v01dv01d

+0

@ v01dv01d使用捕獲組以便能夠引用'text1'和'text2'獨立地匹配'A =([^,] *)。* B =([^,] *)',那麼您的匹配器的'.group(1)'將包含'text1'和'。組(2)''text2'。 ''[^,] *'將匹配所有內容,直到排除下一個逗號爲止 – Aaron

+0

我得到了邏輯並嘗試了,但仍然無效。 那麼,這是迄今爲止看起來正則表達式: '^ GetAndUpdate pcParamQualite \(sDomaineApplicatif =「(D [0-9] {0,})」,sApplication =「(G [0-9] {0,} ) 「sFonctionnalite = 」([^「] {0,})」,sNumeroOrdre = 「([^」] {0,}) 「\):* sCodeMsgExpliControle =」([^「] {0,}) 「,。*' 我想忽略的是冒號和sCodeMsgExpliControle之間的內容(後面還有更多內容,例如我只是將其剪下來) – v01dv01d

相關問題