C# 正则表达式:搜索每个名字的前 3 个字母
C# Regular Expression: Search the first 3 letters of each name
有谁知道我可以使用正则表达式 (C#) 搜索全名的前 3 个字母吗?
不使用 (.*
)
我使用了 (.**
) 但它滚动的文本远远超出了请求的名称,或者
如果它找到第一个条件,并在 100 个单词后找到第二个条件,他 return 一个不是外观的文本,所以我必须限制字数。
示例:\s*(?:\s+\S+){0,2}\s*
我想忽略名称中存在的少于 3 个字符的名称。
搜索包含以下开头的前 3 个字符的任何名称:
'Mar Jac Rey' (regex that performs search)
应该匹配:
- Marck Jacobs L.S. Reynolds
- Marcus Jacobine Reys
- Maroon Jacqueline by Reyils
谁能帮帮我?
我想你想要的是这个正则表达式来检查它是否为真并且不区分大小写
@"^[Mar|Jac|Rey]{3}"
不太具体:
@"^[\w]{3}"
如果你想捕获至少三个字符单词的每个单词的前三个字母,你可以使用类似的东西:
((?<name>[\w]{3})\w+)+
并在初始化 Regex 时启用 ExplicitCapture。
它将return给你一系列名为"name"的Match,每一个都是一个结果。
代码示例:
Regex regex = new Regex(@"((?<name>[\w]{3})\w+)+", RegexOptions.ExplicitCapture | RegexOptions.IgnoreCase);
var match = regex.Matches("Marck Jacobs L. S. Reynolds");
如果你还想捕获3个字符的单词,你可以用space替换最后的“\w”。在这种情况下,考虑处理短语的最后一个词。
默认情况下,零个或多个量词 (*
) 为 'greedy'——也就是说,它将消耗尽可能多的字符以找到模式的其余部分。这就是为什么 Mar.*Jac
将匹配输入中的 first Mar
和 last Jac
以及所有内容介于两者之间。
一个可能的解决方案就是使您的模式 'non-greedy' (*?
)。这将使它消耗尽可能少的字符以匹配模式的其余部分。
Mar.*?Jac.*?Rey
但是,这不是一个很好的解决方案,因为它仍然会匹配各个名称部分,而不管中间出现的其他文本是什么——例如Marcus Jacobine Should Not Match Reys
将是一个有效的匹配项。
要仅允许空格或最多 2 个连续的非空格字符出现在每个名称部分之间,您必须更花哨:
\bMar\w*(\s+\S{0,2})*\s+Jac\w*(\s+\S{0,2})*\s+Rey\w*
模式(\s+\S{0,2})*\s+
将匹配任意数量的最多包含两个字符的非空白字符,每个字符都被空白包围。每个名称部分之后的 \w*
确保整个名称包含在匹配的该部分中(您可能想在这里使用 \S*
,但您的问题并不完全清楚)。我在开头加入了一个单词边界 (\b
) 以确保匹配不会从 'word' 的中间开始(例如 OMar
不会匹配)。
有谁知道我可以使用正则表达式 (C#) 搜索全名的前 3 个字母吗?
不使用 (.*
)
我使用了 (.**
) 但它滚动的文本远远超出了请求的名称,或者
如果它找到第一个条件,并在 100 个单词后找到第二个条件,他 return 一个不是外观的文本,所以我必须限制字数。
示例:\s*(?:\s+\S+){0,2}\s*
我想忽略名称中存在的少于 3 个字符的名称。
搜索包含以下开头的前 3 个字符的任何名称:
'Mar Jac Rey' (regex that performs search)
应该匹配:
- Marck Jacobs L.S. Reynolds
- Marcus Jacobine Reys
- Maroon Jacqueline by Reyils
谁能帮帮我?
我想你想要的是这个正则表达式来检查它是否为真并且不区分大小写
@"^[Mar|Jac|Rey]{3}"
不太具体:
@"^[\w]{3}"
如果你想捕获至少三个字符单词的每个单词的前三个字母,你可以使用类似的东西:
((?<name>[\w]{3})\w+)+
并在初始化 Regex 时启用 ExplicitCapture。
它将return给你一系列名为"name"的Match,每一个都是一个结果。
代码示例:
Regex regex = new Regex(@"((?<name>[\w]{3})\w+)+", RegexOptions.ExplicitCapture | RegexOptions.IgnoreCase);
var match = regex.Matches("Marck Jacobs L. S. Reynolds");
如果你还想捕获3个字符的单词,你可以用space替换最后的“\w”。在这种情况下,考虑处理短语的最后一个词。
默认情况下,零个或多个量词 (*
) 为 'greedy'——也就是说,它将消耗尽可能多的字符以找到模式的其余部分。这就是为什么 Mar.*Jac
将匹配输入中的 first Mar
和 last Jac
以及所有内容介于两者之间。
一个可能的解决方案就是使您的模式 'non-greedy' (*?
)。这将使它消耗尽可能少的字符以匹配模式的其余部分。
Mar.*?Jac.*?Rey
但是,这不是一个很好的解决方案,因为它仍然会匹配各个名称部分,而不管中间出现的其他文本是什么——例如Marcus Jacobine Should Not Match Reys
将是一个有效的匹配项。
要仅允许空格或最多 2 个连续的非空格字符出现在每个名称部分之间,您必须更花哨:
\bMar\w*(\s+\S{0,2})*\s+Jac\w*(\s+\S{0,2})*\s+Rey\w*
模式(\s+\S{0,2})*\s+
将匹配任意数量的最多包含两个字符的非空白字符,每个字符都被空白包围。每个名称部分之后的 \w*
确保整个名称包含在匹配的该部分中(您可能想在这里使用 \S*
,但您的问题并不完全清楚)。我在开头加入了一个单词边界 (\b
) 以确保匹配不会从 'word' 的中间开始(例如 OMar
不会匹配)。