Regexp导致无限挂起

时间:2016-05-27 12:52:53

标签: regex groovy

我有以下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。谁能解释一下怎么可能?

1 个答案:

答案 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}/