需要有关 RegEx 的帮助。使用 C#。
括号中的一组词(圆形或方框或 curl )应被视为一个词。括号外的部分应根据空格 ' ' 进行拆分。
A) 测试用例——
输入 - 安德鲁。 (伟大的音乐家)John Smith-Lt.Gen3rd
结果(字符串数组)-
1. 安德鲁。
2. 伟大的音乐家
3.约翰
4. Smith-Lt.Gen3rd
B) 测试用例——
输入 - 安德鲁。约翰
结果(字符串数组)-
1. 安德鲁。
2.约翰
C) 测试用例——
输入 - Andrew {The Great} Pirate
结果(字符串数组)-
1.安德鲁
2.伟大
3.海盗
输入是一个人或任何其他实体的名字。当前系统是用 Access 编写的非常古老的系统。他们通过逐字符扫描来做到这一点。我正在用 C# 替换它。
我想分两步进行——首先是基于括号的拆分,然后是单词拆分。
我想把这些案例作为错误输入扔掉 -
只有开始或结束括号可用
嵌套括号
总的来说,我只想拆分格式正确的(如果有开始括号,则必须有结尾)仅输入。
最佳答案
这是一个正则表达式,可以根据您的示例给出正确的结果:
\s(?=.*?(?:\(|\{|\[).*?(?:\]|\}|\)).*?)|(?<=(?:\(|\[|\{).*?(?:\}|\]|\)).*?)\s
此正则表达式分为两部分,由 |
分隔(OR) 语句:
-
\s(?=.*?(?:\(|\{|\[).*?(?:\]|\}|\)).*?)
- 在()
组之前寻找空白区域,[]
, 或{}
-
(?<=(?:\(|\[|\{).*?(?:\}|\]|\)).*?)\s
- 在()
组之后寻找空白区域,[]
, 或{}
这是每个部分的细目:
第 1 部分(\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 部分是同一件事,但不是前瞻 ((?=)
),而是后视 ((?<=)
)
作者编辑问题后:
对于将搜索仅包含完整括号的行的正则表达式,您可以使用:
.*\(.*(?=.*?\).*?)|(?<=.*?\(.*?).*\).*
你可以用它来代替(
和 )
与 {
和 }
或 [
和 ]
所以你有完整的大括号和方括号。
关于c# - 用括号分割字符串的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15348828/