我有以下regexp,它永远不会评估并无限挂起:
- echo y | android update sdk --all --no-ui --filter "sys-img-armeabi-v7a-google_apis-23"
- echo "no" | android -v create avd --force -n arm -t "android-23" --abi "google_apis/armeabi-v7a"
- emulator64-arm -avd arm -no-audio -no-window -no-boot-anim & adb wait-for-device
- chmod +x ./gradlew
- ./gradlew connectedDebugAndroidTest
问题在于部分import java.util.regex.Matcher
String AUTOGENERATED_HEADER = "#-=-=-= AUTOGENERATED HEADER =-=-=-"
String AUTOGENERATED_FOOTER = "#-=-=-= AUTOGENERATED FOOTER =-=-=-"
String messages = '''#-=-=-= AUTOGENERATED HEADER =-=-=-
a=b
c=d
x=y
#-=-=-= AUTOGENERATED FOOTER =-=-=-
'''
Matcher matcher = messages =~ /${AUTOGENERATED_HEADER}[\r\n]+((.*[\r\n]*)*)${AUTOGENERATED_FOOTER}/
matcher.find()
。当我将其更改为(.*[\r\n]*)
时,它可以正常工作。
您可以尝试使用regexp here。谁能解释一下怎么可能?
答案 0 :(得分:3)
这里有一个灾难性的回溯案例。见your regex demo。罪魁祸首是(.*[\r\n]*)*
部分,其中包含其他子模式。嵌套的量词会导致太多的回溯,您可以在regex101.com的 regex调试器页面上看到。
解决方案要么使用延迟点匹配:将[\r\n]+((.*[\r\n]*)*)
替换为.*?
,并在模式的开头添加(?s)
修饰符,或者使用展开版本(对于长输入更好,但需要一些硬编码)。
请参阅(?s)#-=-=-= AUTOGENERATED HEADER =-=-=-.*?#-=-=-= AUTOGENERATED FOOTER =-=-=-
的实际操作。使用
Matcher matcher = messages =~ /(?s)${AUTOGENERATED_HEADER}.*?${AUTOGENERATED_FOOTER}/