我使用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,方括号与空格分开。如何修改正则表达式来做到这一点?
答案 0 :(得分:2)
如果您可以忽略空匹配,可以使用Regex.Split()
而不是Regex.Matches()
,其格式如下:
\w+?(?=\W|$)|\W
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)
相反。
修改
猜测,您的附加请求意味着您希望将除以外的其他非单词字符分割为空格,这可以为您做到:
\b|(?<=\s)(?=[^\w\s])|(?<=[^\w\s])(?=\s)|(?<=[^\w\s])(?=[^\w\s])
它使用字符类[^\w\s]
表示非单词,因此不匹配空格。并添加与该字符类中两个字符类之间的位置匹配的替代项。
答案 2 :(得分:0)
您可以尝试分割非单词字符\W
,查看匹配的demo