用括号分割字符串的正则表达式
本文关键字:正则表达式 字符串 分割 | 更新日期: 2023-09-27 18:03:19
需要RegEx的帮助。使用c# .
括号内的一组词(圆括号、方框或大括号)应视为一个词。括号外的部分应该基于空格' '分割。
A)测试用例-输入- Andrew. (The Great Musician) John Smith-Lt.Gen3rd
Result (Array of string) -
1. 安德鲁。
2. 伟大的音乐家
3.约翰。
4. Smith-Lt。Gen3rd
输入- Andrew. John
Result (Array of string) -
1. 安德鲁。
2. 约翰。
Input - Andrew {The Great} Pirate
Result (Array of string) -
1. 安德鲁。
2. 伟大的
3.海盗
输入是一个人或任何其他实体的名称。当前的系统是用Access编写的。他们一个字一个字地扫描。我正在用c#代替它。
我想分两步来做——首先是基于括号的分割,然后是单词分割。
我想把这些情况作为坏输入-
只支持开始或结束括号
嵌套的括号
总的来说,我只想分割格式良好的(如果开始括号在那里,必须有一个结束)输入。
下面是一个正则表达式,它将从您的示例中给出适当的结果:
's(?=.*?(?:'(|'{|'[).*?(?:']|'}|')).*?)|(?<=(?:'(|'[|'{).*?(?:'}|']|')).*?)'s
此正则表达式分为两部分,由|
(OR)语句分隔:
-
's(?=.*?(?:'(|'{|'[).*?(?:']|'}|')).*?)
-查找()
,[]
或{}
集合前的空白 -
(?<=(?:'(|'[|'{).*?(?:'}|']|')).*?)'s
-在()
,[]
或{}
之后寻找空白
以下是各部分的分类:
第一部分('s(?=.*?(?:'(|'{|'[).*?(?:']|'}|')).*?)
):
1. 's - matches white space
2. (?= - Begins a lookahead assertion (What is included must exist after the 's
3. .*? - Looks for any character any number of times. The `?` makes in ungreedy, so it will grab the least number it needs
4. (?:'(|'{|'[) - A non passive group looking for `(`, `{`, or `[`
5. .*? - Same as #3
6. (?:']|'}|')) - The reverse of #4
7. .*? - Same as #3
8. ) - Closes the lookahead. #3 through #7 are in the lookahead.
第2部分是同样的事情,但它不是向前看((?=)
),而是向后看((?<=)
)
作者编辑后的问题:
对于只搜索包含完整括号的行的正则表达式,可以使用:
.*'(.*(?=.*?').*?)|(?<=.*?'(.*?).*').*
您可以使用它将(
和)
替换为{
和}
或[
和]
,以便您有完整的花括号和方括号。
这个怎么样:
Regex regexObj = new Regex(
@"(?<='() # Assert that the previous character is a (
[^(){}[']]+ # Match one or more non-paren/brace/bracket characters
(?=')) # Assert that the next character is a )
| # or
(?<='{)[^(){}[']]+(?='}) # Match {...}
| # or
(?<='[)[^(){}[']]+(?=']) # Match [...]
| # or
[^(){}[']'s]+ # Match anything except whitespace or parens/braces/brackets",
RegexOptions.IgnorePatternWhitespace);
假设没有嵌套的圆括号/大括号/方括号