我有一个字符串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'
There我找到了一个实际上可以匹配绿色的正则表达式,但我将它应用于我的具体问题时遇到了问题:
/^\e\[32m\+\e\[m\e\[32m(.*)\e\[m$/
答案 0 :(得分:1)
您可以测试序列是否在行中:
for line in x.split('\n'):
if '\x1b[32m' in line:
print line
如果你真的需要找到所有包含green-esc序列的行组,你可以这样做:
import re
for chunk in re.findall(r'((?:[^\n]*\x1b\[32m[^\n]*\n)+)', x):
print chunk
但我认为搜索转义序列是一个黑客攻击。 git
确定在使用终端的基础上如何制作绿色等。如果你去另一个终端,你可能会得到不同的转义序列。此外,git
可能决定不打印颜色代码,以防它注意到它的输出不是去往终端而是去另一个进程或文件。
我发现没有简单的替代方法,没有调整git
来打印出特殊格式或类似格式的添加行。所以唯一真正干净的方法就是完全解析git
输出(就像patch
那样),i。即将它所说的行号记下来并忽略格式。但仅靠模式匹配是不可能的。