正则表达式拆分右括号,后跟“ \ b”

时间:2019-07-09 12:48:06

标签: c# regex

我使用C#将这样的字符串分成令牌:

Sum(Table.Fieldname) As Alias
Table2.Fieldname2 As Alias

我将其分解为:

var c = "Sum(Table.Fieldname) As Alias";

string[] Tokens = Regex.Split(c, @"\b")

\ b很好地给了我所有标记,但问题是,当它们位于同一元素中时,我需要将紧跟方括号和空格作为单独的标记:

?System.text.RegularExpressions.Regex.split("Sum(Table.Fieldname) As Alias", "\b")
{Length=11}
(0): ""
(1): "Sum"
(2): "("
(3): "Table"
(4): "."
(5): "Fieldname"
(6): ") "
(7): "As"
(8): " "
(9): "Alias"
(10): ""

在上面,我需要元素6成为元素6和7,方括号与空格分开。如何修改正则表达式来做到这一点?

3 个答案:

答案 0 :(得分:2)

如果您可以忽略空匹配,可以使用Regex.Split()而不是Regex.Matches(),其格式如下:

\w+?(?=\W|$)|\W

Regex demo

C#示例:

string s = "Sum(Table.Fieldname) As Alias";
string[] tokens = Regex.Matches(s,@"\w+?(?=\W|$)|\W")
                       .OfType<Match>()
                       .Select(m => m.Value)
                       .ToArray();
foreach (string token in tokens)
    Console.WriteLine($"'{token}'");

输出:

'Sum'
'('
'Table'
'.'
'Fieldname'
')'
' '
'As'
' '
'Alias'

如果您想坚持使用Regex.Split(),则可以使用类似的方法做同样的事情:

(?<=\w)(?=\W)|(?<=\W)(?=.)

在此处查看比较这两种方法的实时C#示例:https://rextester.com/MYF52225

答案 1 :(得分:1)

您可以执行以下操作:

\b|(?<=\s)(?=\W)|(?<=\W)(?=\s)

用户定义的边界锚的种类:)零长度,空格和非文字字符之间匹配。

(?<=\s)(?=\W)匹配空格和非文字字符之间的位置。
(?<=\W)(?=\s)相反。

See it here at regexstorm.


修改

猜测,您的附加请求意味着您希望将以外的其他非单词字符分割为空格,这可以为您做到:

\b|(?<=\s)(?=[^\w\s])|(?<=[^\w\s])(?=\s)|(?<=[^\w\s])(?=[^\w\s])

它使用字符类[^\w\s]表示非单词,因此不匹配空格。并添加与该字符类中两个字符类之间的位置匹配的替代项。

Here at regexstorm

答案 2 :(得分:0)

您可以尝试分割非单词字符\W,查看匹配的demo