Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
772 views
in Technique[技术] by (71.8m points)

objective c - How do you remove parentheses words within a string using NSRegularExpression?

I am not too familiar with regex and so I been having some getting this to work with Apple's NSRegularExpression

I am trying to remove words in parentheses or brackets...

For example:

NSString *str = @"How do you (remove parentheses words) within a string using"

resulting string should be: @"How do you within a string using"

Thanks you!!!

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Search for

([^()]*)

and replace with nothing.

As a verbose regex:

(      # match an opening parenthesis
[^()]*  # match any number of characters except parentheses
)      # match a closing parenthesis

This will work fine if parentheses are correctly balanced and unnested. If parentheses can be nested (like this (for example)), then you need to re-run the replace until there are no further matches, since only the innermost parentheses will be matched in each run.*

To remove brackets, do the same with [[^[]]*], for braces {[^{}]*}.

With conditional expressions you could do all three at once, but the regex looks ugly, doesn't it?

(?:(()|([)|({))[^(){}[]]*(?(1)))(?(2)])(?(3)})

However, I'm not sure if NSRegularExpression can handle conditionals. Probably not. Explanation of this monster:

(?:           # start of non-capturing group (needed for alternation)
 (()         # Either match an opening paren and capture in backref #1
 |            # or
 ([)         # match an opening bracket into backref #2
 |            # or
 ({)         # match an opening brace into backref #3
)             # end of non-capturing group
[^(){}[]]*   # match any number of non-paren/bracket/brace characters
(?(1)))      # if capturing group #1 matched before, then match a closing parenthesis
(?(2)])      # if #2 matched, match a closing bracket
(?(3)})      # if #3 matched, match a closing brace.

*You can't match arbitrarily nested parentheses (since these constructs are no longer regular) with regular expressions, so that's not a limitation of this regex in particular but of regexes in general.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...