[英]Regex to split closing bracket followed by space alongside “\b”
使用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,方括号与空格分开。 我该如何修改正则表达式来做到这一点?
如果您可以忽略空匹配,可以使用Regex.Matches()
代替Regex.Split()
,其方式如下:
\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
您可以执行以下操作:
\b|(?<=\s)(?=\W)|(?<=\W)(?=\s)
用户定义的边界锚的种类:)零长度,空格和非文字字符之间匹配。
(?<=\\s)(?=\\W)
匹配空格和非单词字符之间的位置。
(?<=\\W)(?=\\s)
反过来。
编辑
猜测您的附加请求意味着您想要分割除空格以外的其他非单词字符,这可以为您做到这一点:
\b|(?<=\s)(?=[^\w\s])|(?<=[^\w\s])(?=\s)|(?<=[^\w\s])(?=[^\w\s])
它使用字符类[^\\w\\s]
表示非单词 ,因此不匹配空格。 并且添加与该字符类中的两个字符类之间的位置匹配的替代项也将在那里拆分。
您可以尝试分割非单词字符\\W
,查看匹配的演示
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.