正则表达式,正在分析“(?:\)*(|)”- ) 不足。

yangyibang 2008-12-30 08:15:55
/// <summary>
/// 回车 换行
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static string rep(string input)
{
input = Regex.Replace(input, "(?:\\)*(\r|\n)", "\\$1");
return input;
}

为什么2个反斜杠\\会出现,正在分析“(?:\)*(|)”- ) 不足的异常。

/// <summary>
/// 回车 换行
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static string rep(string input)
{
input = Regex.Replace(input, "(?:\\\\)*(\r|\n)", "\\$1");
return input;
}

而4个反斜杠就不会出现问题。以及为什么要4个,请高人指点。
...全文
1579 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
tanxiuhong 2009-01-01
  • 打赏
  • 举报
回复
v好深哟!
chinacn101 2009-01-01
  • 打赏
  • 举报
回复
转义的问题
\\表示\本身
那么\就会把它紧跟着的)给转义了,表示)本身,而不是捕获组的)了.
yangyibang 2009-01-01
  • 打赏
  • 举报
回复
恩。我搞错了。
(\\r|\\n)与(\r|\n)在C#里的正则引擎是一样的。
止戈而立 2008-12-31
  • 打赏
  • 举报
回复
只能跟你说:
"(?:\\\\)*(\\r|\\n)"

"(?:\\\\)*(\r|\n)"
的效果是一样的。。
从字符串的层面上来讲是不同,但作为正则式,他们是一样的。
止戈而立 2008-12-31
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 yangyibang 的回复:]
为什么2个反斜杠\\会出现,正在分析“(?:\)*(|)”- ) 不足的异常。
[/Quote]

楼主好好看看提示信息吧。。
你看你的正则式是什么?
这样一个正则是要匹配什么内容呀?
yangyibang 2008-12-31
  • 打赏
  • 举报
回复
回车换行在C#中比较特殊。
yangyibang 2008-12-31
  • 打赏
  • 举报
回复
不对的哦,
之前我也犯过你的错误。

 string s = "\r";
s = rep(s);
s = string.Format("alert('{0}')", s);
ClientScript.RegisterStartupScript(this.GetType(), "alert", s, true);


/// <summary>
/// 回车 换行
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static string rep(string input)
{
string pattern = "(?:\\\\)*(\\r|\\n)";
input = Regex.Replace(input, pattern, "\\$1");
return input;
}

当提示信息类似\r,\r\n,
而不是\\\\\r,即不是多个\加r,就出问题了。
而像其它的在C#代码中如\u等一个\加其它字符的时候
Unrecognized escape sequence
但就回车换行\r\n可以
烈火蜓蜻 2008-12-31
  • 打赏
  • 举报
回复
/// <summary>
/// 回车 换行
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static string rep(string input)
{
input = Regex.Replace(input, "(?:\\)*(\\r|\\n)", "\\$1");
return input;
}
止戈而立 2008-12-31
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 yangyibang 的回复:]
@"(?:\\)*(\r|\n)"

这个写法是有问题的。
会变成
"(?:\\\\)*(\\r|\\n)"

必须这样写

"(?:\\\\)*(\r|\n)"
[/Quote]

你这样理解就错了。。
"(?:\\\\)*(\r|\n)"这里的\r和\n是字符串的回车换行
如果你要用正则式表示回车和换行,恰恰要用\\r和\\n
因此是要写成"(?:\\\\)*(\\r|\\n)"才正确的。
yangyibang 2008-12-31
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 min_jie 的回复:]
还是转义的问题
\\表示\本身
那么\就会把它紧跟着的)给转义了,表示)本身,而不是捕获组的)了.
因此会报错,说)不足..
你可以加一个@,就不用写那么多\了.

C# code@"(?:\\)*(\r|\n)", "\\$1"
[/Quote]

@"(?:\\)*(\r|\n)"
这个写法是有问题的。
会变成
"(?:\\\\)*(\\r|\\n)"

必须这样写
"(?:\\\\)*(\r|\n)"
yangyibang 2008-12-31
  • 打赏
  • 举报
回复
恩,是转义的问题,异常信息已经说的很清楚了,我没看出来而已。

正在分析“(?:\)*(
|
)”- [color=#0000FF])
不足。[/color]


本来用2个\来表示一个\, 在正则分析器处理的时候只存在一个\了。把后面的)给转义了。
accpyy 2008-12-31
  • 打赏
  • 举报
回复
字符转义

如果你想查找元字符本身的话,比如你查找.,或者*,就出现了问题:你没办法指定它们,因为它们会被解释成别的意思。这时你就得使用\来取消这些字符的特殊意义。因此,你应该使用\.和\*。当然,要查找\本身,你也得用\\.

例如:unibetter\.com匹配unibetter.com,C:\\Windows匹配C:\Windows。
止戈而立 2008-12-31
  • 打赏
  • 举报
回复
还是转义的问题
\\表示\本身
那么\就会把它紧跟着的)给转义了,表示)本身,而不是捕获组的)了.
因此会报错,说)不足..
你可以加一个@,就不用写那么多\了.
@"(?:\\)*(\r|\n)", "\\$1"
过河石头 2008-12-31
  • 打赏
  • 举报
回复
要表示字符“\”,在正则里需要转移,也就是 “\\”, 字符串里出现了2个“\”,就是4个了,“\\\\”

正则: (?:\\).*(|)

C# 里是这样的: Regex re = new Regex("(?:\\\\).*(|)", RegexOptions.None);
yangyibang 2008-12-30
  • 打赏
  • 举报
回复
还是写错了
input = Regex.Replace(input, "(?:\\)*(\r|\n)", "\\$1");


input = Regex.Replace(input, "\\)*(\r|\n)", "\\$1");
yangyibang 2008-12-30
  • 打赏
  • 举报
回复
input = Regex.Replace(input, "(?:\\)*(\r|\n)", "\\$1");
这句话是
input = Regex.Replace(input, "\\)*(\r|\n)", "\\$1");

111,115

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧