C# String.Trim()是否可以删除正则表达式\S应该匹配的字符?
请帮助我了解以下情况是否可行:C# String.Trim()是否可以删除正则表达式\S应该匹配的字符?,c#,regex,C#,Regex,请帮助我了解以下情况是否可行: var regexMatch = Regex.Match(inputString, "(\S*\d+\S*|\d)+"); if (regexMatch.Value == String.Empty) { return null; } else { var trimmedString = regexMatch.Value.Trim(); if(trimmmedString != regexMatch.Value) {
var regexMatch = Regex.Match(inputString, "(\S*\d+\S*|\d)+");
if (regexMatch.Value == String.Empty)
{
return null;
}
else
{
var trimmedString = regexMatch.Value.Trim();
if(trimmmedString != regexMatch.Value)
{
//Is there any value for inputString that makes this reachable?
}
}
从.NET4.0开始,
Trim
使用Char.IsWhiteSpace
方法来决定要修剪的内容;列出将被修剪的所有字符。由于\S
的文档没有说明它使用的是相同的字符列表,因此询问是否存在不匹配是一个公平的问题
找到答案的一种方法是彻底搜索:
var ws = new Regex("\\S");
for (char c = '\0'; c != 0xffff; c++) {
if (char.IsWhiteSpace(c)) {
var m = ws.Match("" + c);
if (m.Value.Length != 0) {
Console.Error.WriteLine("Found a mismatch: {0}", (int)c);
}
}
}
运行此代码不会产生任何结果:char.IsWhitespace
认为空白的26个字符中没有一个与正则表达式的\S
匹配。因此,我必须得出这样的结论:trimmedstring!=regexMatch.Value
条件不可访问
作为旁注,regexMatch.Value
永远不能为null
:
如果调用Regex.Match
或Match.NextMatch
方法未能找到匹配项,则返回的Match.value
属性的值为String.Empty
如果,您可以删除第一个
,或者将其替换为与字符串的比较。空的
从.NET 4.0开始,Trim
使用Char.IsWhiteSpace
方法来决定要修剪的内容;列出将被修剪的所有字符。由于\S
的文档没有说明它使用的是相同的字符列表,因此询问是否存在不匹配是一个公平的问题
找到答案的一种方法是彻底搜索:
var ws = new Regex("\\S");
for (char c = '\0'; c != 0xffff; c++) {
if (char.IsWhiteSpace(c)) {
var m = ws.Match("" + c);
if (m.Value.Length != 0) {
Console.Error.WriteLine("Found a mismatch: {0}", (int)c);
}
}
}
运行此代码不会产生任何结果:char.IsWhitespace
认为空白的26个字符中没有一个与正则表达式的\S
匹配。因此,我必须得出这样的结论:trimmedstring!=regexMatch.Value
条件不可访问
作为旁注,regexMatch.Value
永远不能为null
:
如果调用Regex.Match
或Match.NextMatch
方法未能找到匹配项,则返回的Match.value
属性的值为String.Empty
如果,您可以删除第一个,或者将其替换为与字符串进行比较。空您的代码有点可疑,但我将回答字符串.Trim()
是否等同于使用\s
删除前导空格和尾随空格的问题
它们与.NET Framework 4.0相当
- 从.NET 4.0中,将删除使返回值为真的前导字符和尾随字符
Char.IsWhitespace()
根据文档中的描述,为中的字符以及\t
,\n
,\v
,\f
,\r
,\x85
返回true
请注意,似乎存在一些差异。据介绍,U+00A0不间断空格
属于Zs
类别,但MSDN没有将其放入Char.IsWhitespace()
文档中的空格分隔符列表中。测试显示\s
匹配U+00A0
,这意味着U+00A0
是\p{Z}
类别中的字符之一
- 根据该页面,
\s
相当于[\f\n\r\t\v\x85\p{Z}]
。Z
类别目前由3个子类别组成:Zs、Zl、Zp
它们与.NET 4.0之前的版本不同
根据String.Trim()
文档:
由于此更改,.NET Framework 3.5 SP1和早期版本中的修剪方法删除了两个字符,零宽度空格(U+200B)
和零宽度不间断空格(U+FEFF)
,而.NET Framework 4和更高版本中的修剪方法不会删除这两个字符
此外,.NET Framework 3.5 SP1和早期版本中的Trim方法不会修剪三个Unicode空白字符:蒙古语元音分隔符(U+180E)
,窄不间断空格(U+202F)
,以及中等数学空格(U+205F)
简单地说,String.Trim()
考虑在4.0之前的.NET版本中删除一组不同的字符
正则表达式中\s
的规范与.NET 1.1中的规范相同。您的代码有点可疑,但我将回答String.Trim()
是否等同于使用\s
删除前导和尾随空格的问题
它们与.NET Framework 4.0相当
- 从.NET 4.0中,将删除使返回值为真的前导字符和尾随字符
Char.IsWhitespace()
根据文档中的描述,为中的字符以及\t
,\n
,\v
,\f
,\r
,\x85
返回true
请注意,似乎存在一些差异。据介绍,U+00A0不间断空格
属于Zs
类别,但MSDN没有将其放入Char.IsWhitespace()
文档中的空格分隔符列表中。测试显示\s
匹配U+00A0
,这意味着U+00A0
是\p{Z}
类别中的字符之一
- 根据该页面,
\s
相当于[\f\n\r\t\v\x85\p{Z}]
。Z
类别目前由3个子类别组成:Zs、Zl、Zp
它们与.NET 4.0之前的版本不同
根据String.Trim()
文档:
由于这一变化,.NETFramework 3.5SP1和早期版本中的Trim方法删除了两个字符,零宽度空格(U+200B)<