2017-02-21 13 views
2

Я пытаюсь заставить это работать в течение часа, но, похоже, не может это сделать, ни с помощью статей SO, ни Regex101.com.Обратное соответствие Regex для всей строки

Имеют некоторые данные и хотели бы вернуть строки, которые не содержат «/ Common/http». Пример данных:

/Common/http and /Common/Another 
/Common/http-mymon 
/Common/another /Common/http 
another line 

В результате я ищу это:

/Common/http-mymon 
another line 

Любое регулярное выражение я использую должно соответствовать всей линии или она не в двигателе я использую (https://github.com/jayway/JsonPath). Это означает, что http не будет работать, но .*http.* будет.

Надеюсь, это довольно ясно?

/Patrik

+1

Но '/ Common/http-mymon' содержит'/Common/http', не могли бы вы прояснить? –

+0

Спасибо за ваш комментарий. Действительно, это так. Но я хочу только соответствовать этому конкретному «слову». У меня есть регулярное выражение, которое я использую, чтобы найти строки, которые соответствуют ему, если это разъясняет вещи '. * \/Common \/http (?! \ S). *'? – PatrikJ

ответ

2

Вы можете использовать отрицательное опережения регулярное выражение так:

^(?:.*?/Common/http-mymon|(?!.*/Common/http)).*$ 

RegEx Demo


Update:

В соответствии с комментарием ниже OP хочет исключить /Common/http, а затем / или пробел. В этом случае попробуйте это регулярное выражение:

^(?!.*/Common/http(?:/|\s)).*$ 

RegEx Demo 2

+0

Благодарим вас за ответ. Да, но http-mymon может быть чем угодно, пока это может работать в конкретных данных, которые я предоставил, что он не будет работать для других комбинаций. Я просто хочу исключить/Common/http, как слово. – PatrikJ

+0

@PatrikJ use^(?:. *?/Common/http \ S + | (?!. */Common/http)). * $ – radicarl

+1

@PatrikJ: В этом случае попробуйте: '^ (?!. */Common/http (?:/| \ s)). * $ ' – anubhava

1

Я думаю, что вы можете пойти с следующим регулярным выражением

^(?!.*\/Common\/http(?:\s))(.*?)$ 

Это одна проверки не /Common/http перед перед тем пространством с использованием отрицательной предпросмотр (?!.*\/Common\/http(?:\s))

+0

Спасибо за ваш ответ. Почти там, но «другая линия» не была сопоставлена ​​с этим комбо. – PatrikJ

+1

Он должен соответствовать. вы можете увидеть здесь https://regex101.com/r/D6BgJ8/1 –

+1

@SabujHassan, почему вы используете ленивый '. *?'? '. *' никогда не может превышать '$' (за исключением случаев, когда используется с одним модификатором строки, что явно не так) –