Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用正则表达式验证重命名模式_C#_Regex - Fatal编程技术网

C# 使用正则表达式验证重命名模式

C# 使用正则表达式验证重命名模式,c#,regex,C#,Regex,我正在尝试验证用于重命名的模式。 用户将按如下方式填充值: %1% - %3%%2% 我可以匹配正则表达式,一切正常: [^%]*(%[\d]+%)+[^%]* 但在此之前,我希望验证字符串,并能够发现用户何时犯了以下错误: %1% - %3%2% %1% - %3%%2 ... 无论我尝试什么,我都可以得到正确的值,但我不知道字符串的格式是否正确。只能手动检查。 正则表达式有什么方法可以解决这个问题吗?或者也许我不需要正则表达式 编辑以进行澄清 举个很好的例子,就拿一个重命名mp3文件的

我正在尝试验证用于重命名的模式。 用户将按如下方式填充值:

%1% - %3%%2%
我可以匹配正则表达式,一切正常:

[^%]*(%[\d]+%)+[^%]*
但在此之前,我希望验证字符串,并能够发现用户何时犯了以下错误:

%1% - %3%2%
%1% - %3%%2
...
无论我尝试什么,我都可以得到正确的值,但我不知道字符串的格式是否正确。只能手动检查。 正则表达式有什么方法可以解决这个问题吗?或者也许我不需要正则表达式

编辑以进行澄清

举个很好的例子,就拿一个重命名mp3文件的程序来说吧。 您为艺术家定义了%1%和曲目标题%2%之间的映射

对不起,我的错误是只提供了一个字符串。但用户可以提交:

%1% - %3%%2%
%1%_%2%%3%
%1%%3% %2%
...
他想要什么都行。我的目标是在一切都正确的情况下解析字符串,这对我来说似乎没问题。除非我找到一个棘手的坏例子。 但是在保存之前,我想验证并拒绝一个字符串,比如

%1% - %3%%2

我的问题是找到了错误的值。我所做的(在我看来似乎不干净)是使用我的正则表达式,然后验证在字符串中找到的“%”的总数是否为偶数,以及该总数除以2是否等于找到的组的总数。但是我不确定它是否总是有效(不确定我的最后一句话是否清楚)

我认为这个正则表达式就是您想要实现的

(%[\d]%) - (%[\d]%)*

我认为这个正则表达式就是你想要实现的

(%[\d]%) - (%[\d]%)*
我不知道字符串的格式是否正确

此模式检查三个连续的
%%%
,这似乎捕获了大量错误格式场景。然后,我们可以通过添加
$
锚来要求模式只对好的项目验证*,只需要完全形成的有效模式

(\d%)
的有效模式是我们所寻求的:

^         # Start Anchor
(?!.+%%%) # Stop if 3 % anywhere.
%\d%      # First \d
\s-\s     # Dash and spaces
(%\d%)+   # Groups of numbers
$         # Stop Anchor
它适用于您提供的一个示例
%1%-%3%%2%
,与您提供的两个失败示例不匹配

因为此模式是有文档记录的,所以需要使用
IgnorePatternWhiteSpace
作为正则表达式选项。否则,删除所有注释并连接到一行,不带空格


当你使用
*
(从零到多)时,它可能会创建一些不光彩的回溯场景,而这些场景实际上可能会使一个好的模式失败。是否真的会有零个项目

你的例子没有说明这一点;如果不是,为什么不使用
+
1对多

我不知道字符串的格式是否正确

此模式检查三个连续的
%%%
,这似乎捕获了大量错误格式场景。然后,我们可以通过添加
$
锚来要求模式只对好的项目验证*,只需要完全形成的有效模式

(\d%)
的有效模式是我们所寻求的:

^         # Start Anchor
(?!.+%%%) # Stop if 3 % anywhere.
%\d%      # First \d
\s-\s     # Dash and spaces
(%\d%)+   # Groups of numbers
$         # Stop Anchor
它适用于您提供的一个示例
%1%-%3%%2%
,与您提供的两个失败示例不匹配

因为此模式是有文档记录的,所以需要使用
IgnorePatternWhiteSpace
作为正则表达式选项。否则,删除所有注释并连接到一行,不带空格


当你使用
*
(从零到多)时,它可能会创建一些不光彩的回溯场景,而这些场景实际上可能会使一个好的模式失败。是否真的会有零个项目


你的例子没有说明这一点;如果不是,为什么不使用
+
1对多

分享你的研究成果对每个人都有帮助。告诉我们您尝试了什么,以及为什么它不能满足您的需求。这表明你花了时间来帮助自己,它使我们避免重复显而易见的答案,最重要的是,它帮助你得到一个更具体和相关的答案!另见:我不明白你的问题。正则表达式要么匹配(即字符串是格式良好的替换模式),要么不匹配(字符串不是格式良好的替换模式)。问题出在哪里?
if(Regex.IsMatch(s,@“\A%[0-9]+%-%[0-9]+%[0-9]+%\z”){return true;}
如果您可以找到/替换,我会匹配正确的行(包括换行符)并用空字符串替换它们。那样你会弄错所有的线路。如果你想在RE中完成这一切,可能会有点棘手……好吧,我的问题没有精确。我已经更新了。分享你的研究成果对每个人都有帮助。告诉我们您尝试了什么,以及为什么它不能满足您的需求。这表明你花了时间来帮助自己,它使我们避免重复显而易见的答案,最重要的是,它帮助你得到一个更具体和相关的答案!另见:我不明白你的问题。正则表达式要么匹配(即字符串是格式良好的替换模式),要么不匹配(字符串不是格式良好的替换模式)。问题出在哪里?
if(Regex.IsMatch(s,@“\A%[0-9]+%-%[0-9]+%[0-9]+%\z”){return true;}
如果您可以找到/替换,我会匹配正确的行(包括换行符)并用空字符串替换它们。那样你会弄错所有的线路。如果你想在RE中完成这一切,可能会有点棘手……好吧,我的问题没有精确。我已经更新了它。OP想要的是不符合表达式的行,而不是符合表达式的行。@Izzy,但不符合的行只是不符合上述模式的行。现在我也有点困惑。我想我的表达是他想要的,但现在我想知道他是否只想要在“-”后面加两个%[/d]%。我们需要OP的澄清才能继续。正则表达式解析器不理解空格,请将模式中的空格删除到
\s
。否则,您的模式在他的第一个示例中失败。另外,将
\d
放入一个集合
[]
是多余的,并且不起任何作用。OP想要不符合表达式的行,而不是