用于替换的Java正则表达式-如何提高效率

用于替换的Java正则表达式-如何提高效率,java,regex,Java,Regex,我有一个Java正则表达式来执行下面的替换 Pre-substitution | Post-substitution ============================= GOSP_vhqjvfec | GOSP INWMDN_10qkva | INWMDN OS_INT_ihdqivmf0 | OS_INT RSO15_1_%I_0gkuns | RSO15_1 AUDIT124_%I_qkbfn1 | AUDIT124 ==================

我有一个Java正则表达式来执行下面的替换

Pre-substitution   | Post-substitution
=============================
GOSP_vhqjvfec      | GOSP
INWMDN_10qkva      | INWMDN
OS_INT_ihdqivmf0   | OS_INT
RSO15_1_%I_0gkuns  | RSO15_1
AUDIT124_%I_qkbfn1 | AUDIT124
==============================
我用过这个正则表达式

regular exp  -> (.*?)_%.*|(.*)_.*
substitution -> $1$2

我想知道是否有更好的方法来执行此操作?

您可以使用以下更简单的正则表达式:

str = str.replaceFirst("_(%\\S*|[^_\\s]+)\\b", "");
i、 e.匹配一个下划线,后跟2个替换项:

  • %
    和0个或更多非空格字符
  • 1个或多个非下划线和非空格字符
这一切之后应该有一个词的边界


您可以使用以下更简单的正则表达式:

str = str.replaceFirst("_(%\\S*|[^_\\s]+)\\b", "");
i、 e.匹配一个下划线,后跟2个替换项:

  • %
    和0个或更多非空格字符
  • 1个或多个非下划线和非空格字符
这一切之后应该有一个词的边界

另一种变体:

_%I.*$|_[^_]+$
另一种变体:

_%I.*$|_[^_]+$

非常整洁的方法,很好@阿努巴瓦,谢谢你的快速回复,我会测试一下Monday@anubhava,我正面临上述问题(我的错,我忘了在问题中提及情况)。。如果有一个值,如OSR_PREP或GOM_GSO_12,它应该保持不变,并且不应该有任何替换…这是我的question@anubhava,对于上述条件,如果最多只有9个字符,且所有字符均为大写,这些值不应该有替代项。好的,您应该编辑您的问题,并添加这些示例以清楚说明。我将尝试在这个基础上修改我的正则表达式。非常简洁的方法,很好@阿努巴瓦,谢谢你的快速回复,我会测试一下Monday@anubhava,我正面临上述问题(我的错,我忘了在问题中提及情况)。。如果有一个值,如OSR_PREP或GOM_GSO_12,它应该保持不变,并且不应该有任何替换…这是我的question@anubhava,对于上述条件,如果最多只有9个字符,且所有字符均为大写,这些值不应该有替代项。好的,您应该编辑您的问题,并添加这些示例以清楚说明。我将尝试基于此修改我的正则表达式。无论如何,即使我的正则表达式看起来更容易阅读,anubhava的解决方案也运行得更快,因此效率更高(regex101上52个步骤vs 60个步骤)。无论如何,即使我的正则表达式看起来更容易阅读,anubhava的解决方案运行得更快,因此效率更高(regex101上52个步骤vs 60个步骤)。