Help With Particular Regular Expression - Not Containing Some String

倾然丶 夕夏残阳落幕 提交于 2019-12-23 10:36:11

问题


How do I say, in regular expressions:

Any portion of a string beginning with a capital letter, containing at least one space character, not containing the string
" _ " (space underscore space), and ending with the string "!!!" (without the quotes)?

I am having trouble with the "not containing" part.

Here is what I have so far:

[A-Z].* .*!!!

How do I modify this to also specify "Not containing ' _ '"?

It does not need to be the specific string " _ ". How can I say "not containing" ANY string? For instance not containing "dog"?

Edit: I'd like the solution to be compatible with Php's "preg_replace"

Edit: Examples:

Examples for " _ ":

Abc xyz!!! <---Matches

Hello World!!! <---Matches

Has _ Space Underscore Space!!! <--- Does Not Match

Examples for "dog":

What a dog!!! <--- Does not match, (contains "dog")

Hello World!!! <--- Matches


回答1:


The x(?!y) expression matches x only if it is not immediately followed by y. So, this seems to be the thing you want:

[A-Z](?!%s)(.(?!%s))* (.(?!%s))*!!!

Where %s is your forbidden string.




回答2:


Any possible regex for this would be probably much more complicated than two regexes. One like yours: [A-Z].* .*!!! and the second applied on matched strings and checking whether _ is contained.




回答3:


Start with Any capital; have an optional string of everything except an underscore, a space, and then the everything except underscore again, followed by three exclamation marks.

[A-Z][^_]*[ ][^_]*!!!



回答4:


First test your string for any occurance of " _ ", since that is a no match. Then check for what you want.

That's what I would do instead of spending a lot of time trying to figure out one regular expression for it.

Here's a nice site for testing your expressions: Nregex

Edit: I read some more on your question and see that my answer wasn't really good, so here's another attempt. A modification of one of the expressions above:

[A-Z](?! _ )(\w(?! _ ))* (\w(?! _ ))*!!!



回答5:


[A-Z]([^ ]*(?! _ ) ?)*!!!

Edit: I missed your requirement for at least one space. The below regex includes that requirement:

[A-Z][^ ]* (?!_ )((?! _ ).)*!!!



回答6:


I used to resolve it via grep's -v option (if I'm on Linux and/or can use grep).

So search for something, then skip the uninteresting parts.

grep something <INPUT> | grep -v uninteresting

Without grep (damn windows, without admin rights) but with Vim:

vim -c "v/i'm searching for this/d" -c "g/and don't need this/d" -c "w checkoutput" <INPUT>

(This opens , then deletes every line what does not match what you need, then deletes every line, what you does not need, then save the results as checkoutput. Which you should check.)

HTH




回答7:


There is a nice little program in which you can built your regex together with testing it.

http://software.marioschneider-online.de/?C%23%3A_RegEx_Test



来源:https://stackoverflow.com/questions/3966318/help-with-particular-regular-expression-not-containing-some-string

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!