我有这个正则表达式:
string[] values = Regex
.Matches(mystring4, @"([\w-[\d]][\w\s-[\d]]+)|([0-9]+)")
.OfType<Match>()
.Select(match => match.Value.Trim())
.ToArray();
此正则表达式将转换此字符串: 我的有限公司(52100000/58447000)&#34 ;;
对于这些字符串:
我的有限公司 - 52100000 - 58447000
这也适用于非英文字符。
但是有一个问题,当我有这个字符串时:MY。有限。公司。 ,它也分裂了。我不想要那个。我不希望那个正则表达式在点上工作。我怎样才能做到这一点?感谢。
答案 0 :(得分:2)
您可以在模式中的每个\w
后添加点,我还建议删除不必要的(
和)
:
string[] values = Regex
.Matches("MY. LIMITED. COMPANY. (52100000 / 58447000)", @"[\w.-[\d]][\w.\s-[\d]]+|[0-9]+")
.OfType<Match>()
.Select(match => match.Value.Trim())
.ToArray();
foreach (var s in values)
Console.WriteLine(s);
请参阅C# demo
<强>模式强>:
[\w.-[\d]]
- 一个Unicode字母或下划线([\w-[\d]]
)或一个点(.
)[\w.\s-[\d]]+
- 1个或多个(由于末尾为+
量词)字符为Unicode字母或下划线,.
或空格(\s
)< / LI>
|
- 或[0-9]+
- 一个或多个ASCII-only数字答案 1 :(得分:1)
我简化了表达方式。如果前面的名字包含数字怎么办?并不是说我的解决方案并不完全模仿原始表达式。它将允许名称部分中的数字。
让我们从头开始:
要匹配单词,您需要的是一系列单词字符:
\ W +
这将匹配任何字母数字字符,包括下划线(_
)。
考虑到您希望单词以点结尾的可能性,您可以添加它并使其成为可选(一个或零匹配):
\ W + \。?
注意转义使它成为一个真实的角色,而不是一个角色类&#34;任何角色&#34;。
为了匹配下面的另一个潜在词,我们现在只需复制此匹配,之前添加空格,然后使用*
量词再次使其成为可选项:
\ W + \。?(?:?\ W + \)*
如果您还没有看到以?:
开头的群组是不匹配的群组。从本质上讲,它的工作方式与普通组相同,但不会在搜索结果中保存匹配的组。
而且已经存在了。此模式将按预期分割您的演示字符串。当然,可能还有其他可能的角色没有被这个覆盖。
You can see the results of this matching online here and also play around with it.
要测试正则表达式(并了解它们),我建议您使用http://regex101.com等工具
它有一个输入掩码,允许您提供模式和目标字符串。在右侧,它将首先向您解释模式(以确定它是否确实是您的想法),并在下方显示所有匹配的组。请记住,它实际上使用了略微不同的正则表达式,但这对于这种简单的模式并不重要。 (我与该网站没有任何关系,只考虑它非常有用。)
作为替代方案,要直接使用C#的正则表达式解析器,您也可以尝试使用此Regex Tester。虽然不包含任何解释,但这可能不适合刚入门的人。