2014-12-04 4 views
2

Я использую функцию поиска регулярных выражений notepad ++ для поиска всех строк в документе .txt, которые не содержат определенного значения (HIJ в приведенном ниже примере), где все строки начинаются с то же значение (ABC в приведенном ниже примере).Regex найти строки, не содержащие заданного значения

Как бы я это сделал?

Пример

  • Каждая строка начинается с ABC
  • ABC никогда не используется в строке другой, чем в начале, ABCABC123 бы две строки - «ABC» и «ABC123»
  • HIJ может появляться несколько раз в строке
  • Мне нужно найти строки, которые не содержат HIJ
  • Ввод - это один длинный файл без разрывов строк, но содержит специальные символы (* , ^, @, ~, :) и пространства

Пример ввода:

[email protected]:HIJABC12~34HI456J 

Пример ввода будет рассматриваться как следующие строки

ABC1234HIJ56 
[email protected] 
ABC89 
ABCHIJ0ABE:HIJ 
ABC12%34HI456J 

третьей и пятой строки как отсутствие «HIJ» и, следовательно, включены в выход, все остальные не включены в выход.

Пример желаемый результат:

ABC89 
ABC12~34HI456J 

Я 99% новый в RegEx и будет смотреть в него больше в будущем, как мое описание работы вдруг изменилось в начале этой недели, когда кто-то в компании осталось внезапно , и поэтому я делаю это вручную, выполнив поиск (ABC | HIJ) и выполнив результаты функции поиска, которые ищут «ABC», появляющиеся дважды подряд. Предположительно бывший сотрудник смог сделать это автоматическим способом, но не оставил никакой документации.

Любая помощь будет оценена!

Этот вопрос является повторением предыдущего вопроса, который я задал, но мне было очень плохо при форматировании вопроса, и он, кажется, опустился выше заметных уровней.

ответ

2

Вы можете найти элементы, которые вы хотите с:

ABC(?:[^HA]+|H(?!IJ)|A(?!BC))*+(?=ABC|$) 

Примечание: в первом шаблоне, вы можете заменить (?=ABC|$) с (?!HIJ)

модели детали:

ABC 
(?:   # non-capturing group 
    [^HA]+  # all that is not a H or an A 
    |   # OR 
    H(?!IJ) # an H not followed by IJ 
    | 
    A(?!BC) # an A not followed by BC 
)*+   # repeat the group 
(?=ABC|$)  # followed by "ABC" or the end of the string 

Примечание: если вы хотите удалить все, что вы не хотите, чтобы вы могли заменить этот поиск:

search: (?:ABC(?:[^HA]+|H(?!IJ)|A(?!BC))*+HIJ.*?(?=ABC|$))+|(?=ABC) 
replace: \r\n 
+0

вам нужен модификатор/g, чтобы получить несколько – blackmind

+1

@blackmind: Нет, так как это t o использовать в Notepad ++, у пользователя есть выбор, чтобы нажать кнопку «Найти» или «найти». –

+0

пропустил эту часть, ну FYI кому-либо еще не используя блокнот ++ – blackmind

0

Вы можете использовать следующее выражение, чтобы соответствовать вашему критерию:

(^ABC(?:(?!HIJ).)*$) 

Это начинается с ABC и смотрит вперед (отрицательный) для HIJ шаблона. Шаблон работает для разделенных строк.

Для одного шаблона линии (как это предусмотрено в вашем вопросе), небольшая модификация этого работает (следующим образом):

(ABC(?:(?!HIJ).)*?)(?=ABC|$) 
0

вы могли бы использовать этот шаблон

(ABC(?:(?!HIJ).)*?)(?=ABC|\R) 

Demo

(    # Capturing Group (1) 
    ABC   # "ABC" 
    (?:   # Non Capturing Group 
    (?!   # Negative Look-Ahead 
     HIJ  # "HIJ" 
    )   # End of Negative Look-Ahead 
    .   # Any character except line break 
)    # End of Non Capturing Group 
    *?   # (zero or more)(lazy) 
)    # End of Capturing Group (1) 
(?=    # Look-Ahead 
    ABC   # "ABC" 
    |    # OR 
    \R   # <line break> 
)    # End of Look-Ahead 
Смежные вопросы