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