Непонятно в вашем вопросе, из чего состоит слово.Допускаются ли дополнительные подчеркивания?Разрешены ли цифры?Как насчет «слов, которые состоят только из префикса», например, «abc_» или «xyz»?
Делая консервативные предположения (основанные на ваших примерах), что вы ожидаете только буквы от английского алфавита, по крайней мерееще один символ, и вы не заботитесь о регистре, вы можете упростить свое регулярное выражение:
[regexp -nocase -- {\m(abc_|xyz_)[a-zA-Z]+} $str match]
Это установит match
в соответствующее слово.Вы можете заменить квадратные скобки, если ваше определение слова отличается от моих предположений.
Ваш второй вопрос о том, предпочитать ли регулярное выражение строковым функциям, зависит от контекста и может привести к субъективной территории.
Некоторые вопросы, которые следует учитывать:
- Действительно ли производительность имеет значение?Если вы не выполняете поиск в узком цикле или ищете очень длинные строки, я подозреваю, что разница в производительности не будет существенной.Подождите, пока у вас не возникнет проблема с производительностью, затем профилируйте свое приложение, чтобы увидеть узкое место, затем вы можете протестировать альтернативные реализации.
- Удобство будет зависеть от предпочтений программиста (ов), которые должны писатьи поддерживать код.Любят ли они / ненавидят использование регулярных выражений?
- Использование регулярных выражений может предложить большую гибкость, но это может быть за счет читабельности.
Моя рекомендация будет заключаться в том, чтобы использовать любое другоевам наиболее комфортно сНапишите хороший набор модульных тестов для своего кода, а затем оптимизируйте его позже, только если вы обнаружили узкое место во время профилирования.