2017-06-02 34 views
0

我有一個字符串x,看起來像這樣。前面帶加號的行是彩色編碼的。RegEx,只顯示彩色線條(從git diff輸出)

diff --git js/js.tests/test/org/jetbrains/kotlin/js/test/JsLineNumberTestGenerated.java js/js.tests/test/org/jetbrains/kotlin/js/test/JsLineNumberTestGenerated.java 
index 55597bf..9115830 100644 
--- js/js.tests/test/org/jetbrains/kotlin/js/test/JsLineNumberTestGenerated.java 
+++ js/js.tests/test/org/jetbrains/kotlin/js/test/JsLineNumberTestGenerated.java 
@@ -38,0 +39,6 @@ public class JsLineNumberTestGenerated extends AbstractJsLineNumberTest { 
+ @TestMetadata("chainedCall.kt") 
+ public void testChainedCall() throws Exception { 
+  String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/chainedCall.kt"); 
+  doTest(fileName); 
+ } 
+ 
@@ -92,0 +99,6 @@ public class JsLineNumberTestGenerated extends AbstractJsLineNumberTest { 
+ @TestMetadata("longLiteral.kt") 
+ public void testLongLiteral() throws Exception { 
+  String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/longLiteral.kt"); 
+  doTest(fileName); 
+ } 
+ 

我要提取的綠線,使得在端我有兩個字符串(字符串的數組)所示:

@TestMetadata("chainedCall.kt") 
    public void testChainedCall() throws Exception { 
     String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/chainedCall.kt"); 
     doTest(fileName); 
    } 

@TestMetadata("longLiteral.kt") 
    public void testLongLiteral() throws Exception { 
     String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/longLiteral.kt"); 
     doTest(fileName); 
    } 

原始git diff的輸出是這樣的(你也可以看到顏色代碼):

'\x1b[1mdiff --git js/js.tests/test/org/jetbrains/kotlin/js/test/JsLineNumberTestGenerated.java js/js.tests/test/org/jetbrains/kotlin/js/test/JsLineNumberTestGenerated.java\x1b[m\n\x1b[1mindex 55597bf..9115830 100644\x1b[m\n\x1b[1m--- js/js.tests/test/org/jetbrains/kotlin/js/test/JsLineNumberTestGenerated.java\x1b[m\n\x1b[1m+++ js/js.tests/test/org/jetbrains/kotlin/js/test/JsLineNumberTestGenerated.java\x1b[m\n\x1b[[email protected]@ -38,0 +39,6 @@\x1b[m \x1b[mpublic class JsLineNumberTestGenerated extends AbstractJsLineNumberTest {\x1b[m\n\x1b[32m+\x1b[m\x1b[32m @TestMetadata("chainedCall.kt")\x1b[m\n\x1b[32m+\x1b[m\x1b[32m public void testChainedCall() throws Exception {\x1b[m\n\x1b[32m+\x1b[m\x1b[32m  String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/chainedCall.kt");\x1b[m\n\x1b[32m+\x1b[m\x1b[32m  doTest(fileName);\x1b[m\n\x1b[32m+\x1b[m\x1b[32m }\x1b[m\n\x1b[32m+\x1b[m\n\x1b[[email protected]@ -92,0 +99,6 @@\x1b[m \x1b[mpublic class JsLineNumberTestGenerated extends AbstractJsLineNumberTest {\x1b[m\n\x1b[32m+\x1b[m\x1b[32m @TestMetadata("longLiteral.kt")\x1b[m\n\x1b[32m+\x1b[m\x1b[32m public void testLongLiteral() throws Exception {\x1b[m\n\x1b[32m+\x1b[m\x1b[32m  String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/longLiteral.kt");\x1b[m\n\x1b[32m+\x1b[m\x1b[32m  doTest(fileName);\x1b[m\n\x1b[32m+\x1b[m\x1b[32m }\x1b[m\n\x1b[32m+\x1b[m' 

There我發現了一個正則表達式實際上可以匹配的綠顏色,但我與它應用於我的具體問題的問題:

/^\e\[32m\+\e\[m\e\[32m(.*)\e\[m$/

+0

您是否考慮grep以'+'開頭的行呢?關鍵是在處理unix命令的ASCII輸出時不鼓勵顏色;他們只在屏幕上有意義。很多程序在注意到其輸出被傳遞到另一個命令後立即停止生成顏色代碼。 – Alfe

+0

鏈接問題中的接受答案適用於顏色代碼,因爲可能有其他的行在前面有加號。另外我使用GitPython在Python中工作,所以沒有可用的grep。 – ScientiaEtVeritas

+0

我並不是指Unix命令'grep',而是指grepping(* g * etting與* re * gular ex * p * ression相匹配的東西)的行爲。 – Alfe

回答

1

您可以測試如果序列是在該行:

for line in x.split('\n'): 
    if '\x1b[32m' in line: 
     print line 

如果你真的需要找到線的羣體,所有包含綠色ESC序列,你可以像這樣做:

import re 

for chunk in re.findall(r'((?:[^\n]*\x1b\[32m[^\n]*\n)+)', x): 
    print chunk 

但我認爲尋找逃逸序列是一種破解。 git決定使用終端的基礎上如何使東西變成綠色等。如果你去一個不同的終端,你可能會得到不同的轉義序列。此外,git可能會決定不打印顏色代碼,以防注意到其輸出不會傳送到終端,而是傳送到另一個進程或文件。

我發現沒有簡單的選擇,但沒有調整git以打印出特殊格式或類似的附加行。所以唯一真正乾淨的方法就是完全解析git輸出(如patch會這樣做),即i。即將它所說的行號考慮在內並忽略格式。但僅僅通過模式匹配是不可能的。

+0

讓我注意到,可以強制git使用參數''--color = always''輸出顏色代碼。 – ScientiaEtVeritas

+0

但是沒有記錄'git'將使用哪種顏色代碼。這可能取決於當前的終端。然而,Linux上的版本2.7.4似乎是不可知的,並且始終使用相同的顏色代碼,而不管終端。我不敢打賭,後來的版本或Windows版本(或更奇怪的東西)總是會這樣做。顏色代碼只是一些無意搜索的東西。然而,這是一個黑客。 – Alfe