Regex 获取字符串中每个单词的第一个字母,并使用正则表达式连接成新词

Regex 获取字符串中每个单词的第一个字母,并使用正则表达式连接成新词,regex,vb.net,Regex,Vb.net,我不知道如何将正则表达式匹配中的所有第一个匹配字母连接起来。我正在努力扩展我对正则表达式的知识和使用 下面我展示的代码正是我想要做的,但是我希望能够使用regex做同样的事情。我尝试过的正则表达式代码很好地匹配每个单词的第一个字母,一次一个单词,但我希望一次获得所有的第一个字母,而不出现循环 If Not myString.Contains("/") And myString.ToUpper() = myString Then Dim words As String() = myStri

我不知道如何将正则表达式匹配中的所有第一个匹配字母连接起来。我正在努力扩展我对正则表达式的知识和使用

下面我展示的代码正是我想要做的,但是我希望能够使用regex做同样的事情。我尝试过的正则表达式代码很好地匹配每个单词的第一个字母,一次一个单词,但我希望一次获得所有的第一个字母,而不出现循环

If Not myString.Contains("/") And myString.ToUpper() = myString Then
    Dim words As String() = myString.Split(" "c)
    Dim initials As String = ""
    For Each Word As String In words
        initials &= Word(0)
    Next
    DGV1(1, i).Value = initials
End If
我尝试过的正则表达式一次只匹配一个字母:我的字符串(myString)类似于:delrey name CLUB

Dim initial As String = Regex.Match(myString, "\b[a-z][A-Z]")

从显示的示例正则表达式代码中,我希望在DataGridView单元格中显示首字母DRnC,就像上面显示的非正则表达式方法一样。

我认为最好的方法是找到所有首字母,然后计算结果:

Dim results As String = String.Concat(Regex.Matches(myString, "\b\p{L}").Cast(Of Match)().Select(Function(m) m.Value).ToList())
在这里,
\b\p{L}
查找所有出现在前面没有字母、数字或连接符标点符号和一些变音符号的字母
Regex.Matches
匹配字符串中的所有匹配项,然后,
.Cast(匹配项)().Select(Function(m)m.Value.ToList()
将匹配值提取到列表中,并将它们连接到单个字符串中

如果您计划使用一个单一的正则表达式方法调用,您可以考虑<代码>正则表达式。

Dim results As String = Regex.Replace(text, "\P{L}*(?:(\p{L})\p{L}*|$)", "$1")
这里,
\p{L}*(?:(\p{L})\p{L}*|$)
匹配字母以外的任何0+字符,然后匹配并捕获到组1中的任何字母,然后匹配任何0+字母,或匹配字符串的结尾。
$1
替换将恢复结果中的第一个单词字母


请参阅。

这里的代码是一个非常简单的答案,适合我的应用程序(没有Wiktor Stribizew提供的那么健壮)。我的输入字符串总是大写字母,只是因为我用If-Not语句强制它…参见原始问题。代码:Dim initials As String=Regex.Replace(myString,“(\B[A-Z][]*)”,”)

尝试
Dim initials As String=Regex.Replace(text,“\W*(?:\B(\W)\W*|$),“$1”)
。若要仅匹配字母,请使用
“\P{L}*(?:(\P{L})\P{L}*|$)”
此外,为什么不使用更直接的
Dim results作为String=String.Concat(Regex.Matches(myString),\b\w”).Cast(匹配的)()。选择(函数(m)m.Value.ToList())
?对于我的应用程序来说,使用replace的建议是最干净的。它就像一个符咒。谢谢你的帮助。我已经将代码减少了五行。请参阅上面我的第一条评论。我正在使用:Dim results作为String=Regex.Replace(文本,“\P{L}*(?:(\P{L})\P{L}*|$)”,“$1”)。非常好用…再次感谢。