我正在尝试使用正则表达式优化几个应用程序。
我们目前使用的是绝对可怕的,我在某种程度上仅限于使用正则表达式进行数据操作。
变量fruits
具有以下值:
apple_banana_kiwi_cherry_cucumber_tomato_car_telephone
抓住_
第2次到第5次之间的所有事件
例如,对于apple_banana_kiwi_cherry_cucumber_tomato_car_telephone
结果应该是:
kiwi_cherry_cucumber
我现在拥有的是^[a-zA-Z]+_[a-zA-Z]+_([a-zA-Z]+_[a-zA-Z]+_[a-zA-Z]+)_
这是从字符串中提取数据的最有效方法吗?另外,有一种更好的方式编写此语句,这样更易于阅读吗?
答案 0 :(得分:1)
您可以使用此正则表达式捕获组1的内容,
(?:[^_]*_){2}((?:[^_]*_){2}[^_]*)
说明:
(?:[^_]*_){2}
-此部分捕获了一些仅包含两个下划线的文本。((?:[^_]*_){2}[^_]*)
-该部分使用_
捕获某些文本,该文本再次包含一些文本,这些文本仅包含两个下划线,另外还有一些文本,除了[^_]*
以外的其他零个或多个字符,并停止捕获该时刻似乎是第五个下划线,并在group1中捕获了此文本。此后,您将在第1组的第二个下划线和第五个下划线之间找到所有内容。
此外,如果您只希望仅进行第一个匹配而不是多个匹配,则可以在正则表达式之前使用起始锚^
并像这样使用它,
^(?:[^_]*_){2}((?:[^_]*_){2}[^_]*)
此外,您的正则表达式^[a-zA-Z]+_[a-zA-Z]+_([a-zA-Z]+_[a-zA-Z]+_[a-zA-Z]+)_
也是正确的,但仅允许使用字母,因此,如果您只想在下划线之间允许使用字母,则可以使用它,否则使用我的正则表达式,我的正则表达式会比较紧凑使用量词。另外,我的正则表达式将帮助您扩展,以防万一,例如明天您说,我想将N
和Mth
下划线的所有内容匹配到N
和M
下划线数字,在这种情况下,这种简短的正则表达式将有所帮助。