RegEx,只显示彩色线条(从git diff输出)

我有一个字符串x ,看起来像这样。 前面带加号的行是彩色编码的。

 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[36m@@ -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[36m@@ -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' 

在那里,我发现了一个实际上可以匹配绿色的正则表达式,但是我在将其应用于具体问题时遇到了问题:

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

你可以测试序列是否在行中:

 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那样),也就是把它所说的行号考虑进去,而忽略格式化。 但是这仅仅是模式匹配是不可能的。