2013-07-19 3 views
0

Я в настоящее время пытаюсь удалить текст в середине этой строки:Используя положительный предпросмотр, чтобы удалить середину строки

RenameMe_12345_12365_130706T234502.txt 

используя следующее регулярное выражение:

^[a-zA-Z]+(?=_[0-9]+_[0-9]+).+$ 

в попытка вернуться:

RenameMe_130706T234502.txt 

но регулярное выражение возвращает всю строку, не исключая середину:

RenameMe_12345_12365_130706T234502.txt 

Я пользуюсь положительным взглядом неправильно или неправильно подхожу к проблеме? Могут ли положительные взгляды не использоваться таким образом?

+0

Если вы хотите удалить середину, вы можете захватить фронт и обратно и объединить их вместе. – iamnotmaynard

ответ

4

заменить это регулярное выражение:

_.*_ 

с

_ 

пример с sed инструмента:

kent$ echo RenameMe_12345_12365_130706T234502.txt|sed 's/_.*_/_/' 
RenameMe_130706T234502.txt 

Вы можете сделать это с вашим собственным языком инструмент/программирования.

EDIT для комментариев OP в:

@CodingUnderDuress _.*_ является единственным регулярным выражением (BRE). Он использует жуткий персонаж .* для достижения вашей цели.

Если вы не хотите делать замены, только с регулярным выражением, чтобы соответствовать части вам нужно, вы можете сделать:

(^[^_]*|_[^_]*$) 

тест с Grep: (-E означает ERE)

kent$ echo "RenameMe_12345_12365_130706T234502.txt"|grep -Eo '(^[^_]*|_[^_]*$)' 
RenameMe 
_130706T234502.txt 

Вы можете, конечно, использовать look-behind/forward, если вы действительно любите их. то вам понадобится PCRE. И я не понимаю, почему нам нужно использовать внешний вид здесь для вашего требования.

+0

Правильно. Я обычно нахмурился, используя точку, но это будет работать отлично. '_ \ w * _' также будет работать и будет быстрее, потому что' \ w' содержит символы подчеркивания, но не включает периоды. Но мы говорим о 5 циклах быстрее, ничего. '_ [\ d_] * _' был бы самым быстрым, предполагая, что «средний» всегда был цифрой.+1 – Suamere

+0

Ускоренная скорость, '\ d' также может включать в себя номера номеров в формате Юникод. Поэтому было бы гораздо быстрее использовать класс символов '[0-9]' вместо '\ d'. –

+0

Большое спасибо. Просто из любопытства, нельзя ли это сделать, используя одно регулярное выражение и взгляд? – CodingUnderDuress

0

Вы можете заменить содержимое этого на пустой символ

_(\w+(?=_))* 

Работа

[1] Match the character `_` 
[2] followed a set of word characters 
[3] I have used positive look-ahead `?=_` to make sure the last `_` is not missed out 
[4] Match the above 0 or more times 
0

Используйте этот

(?<=[^_])_\w+_(?=[^_]+) 

, чтобы соответствовать той части, которую нужно удалить.

Смежные вопросы