将 po box javascript 正则表达式转换为 c# 正则表达式
Posted
技术标签:
【中文标题】将 po box javascript 正则表达式转换为 c# 正则表达式【英文标题】:Convert po box javascript regex to c# regex 【发布时间】:2016-09-13 20:05:56 【问题描述】:我在堆栈溢出文章中看到了以下 javascript 正则表达式,我想将其转换为 C#:
var poBox = /^ *((#\d+)|((box|bin)[-. \/\\]?\d+)|(.*p[ \.]? ?(o|0)[-. \/\\]? *-?((box|bin)|b|(#|num)?\d+))|(p(ost)? *(o(ff(ice)?)?)? *((box|bin)|b)? *\d+)|(p *-?\/?(o)? *-?box)|post office box|((box|bin)|b) *(number|num|#)? *\d+|(num|number|#) *\d+)/i;
我尝试在开头和结尾删除 / 我认为它用于表示字符串文字,我还在末尾删除 /i 这似乎是为了不区分大小写,但我似乎仍然缺少其他转换在这里。
原始堆栈溢出文章在这里: PO Box Regular Expression Validation
谁能告诉我这里还缺少什么?对正则表达式不太熟悉,我在这里有点挣扎。
编辑:
这是修改后的c#代码,上面有注释:
public const string PoBoxRegex = @"^ *((#\d+)|((box|bin)[-. \/\\]?\d+)|(.*p[ \.]? ?(o|0)[-. \/\\]? *-?((box|bin)|b|(#|num)?\d+))|(p(ost)? *(o(ff(ice)?)?)? *((box|bin)|b)? *\d+)|(p *-?\/?(o)? *-?box)|post office box|((box|bin)|b) *(number|num|#)? *\d+|(num|number|#) *\d+)";
public static bool IsPoBox(string addressToCheck)
if (string.IsNullOrWhiteSpace(addressToCheck))
return false;
if (Regex.IsMatch(addressToCheck, PoBoxRegex, RegexOptions.IgnoreCase))
return true;
return false;
【问题讨论】:
如果您展示了到目前为止的 c# 以及您得到的语法错误是什么,将会有所帮助。 如果您删除了/i
,您是否至少在使用RegexOptions.IgnoreCase
?您还应该使用逐字字符串文字 - @"pattern"
,并将 \/
替换为 /
该模式应该在 C# 中运行良好。如果你写得对。
@Wobbles,老实说,c# 是如此简单,我认为没有必要或必要发布此内容。反正我已经发过了。这不是语法错误。事实上,正则表达式无法识别它在原始堆栈溢出帖子中所说的输入
是的,但是我们需要检查语法、拼写错误以及任何其他可能导致表达式在 c# 中失败的事情。您也没有指出实际问题是什么,它是否抛出异常,是否找不到匹配项?如果后者可以按照MCVE 的建议提供一个示例字符串来测试它
【参考方案1】:
由于有/i
修饰符,您需要使用RegexOptions.IgnoreCase
。所有\/
都应写为/
,因为正斜杠不是特殊的正则表达式字符,也不是正则表达式分隔符(这些在C# 正则表达式中不存在)。将 JS 正则表达式文字转换为 C# 模式时,您还需要使用逐字字符串文字(即@"pattern"
)形式。
所以,使用
string PoBoxRegex = @"(?i)^ *((#\d+)|((box|bin)[-. /\\]?\d+)|(.*p[ .]? ?(o|0)[-. /\\]? *-?((box|bin)|b|(#|num)?\d+))|(p(ost)? *(o(ff(ice)?)?)? *((box|bin)|b)? *\d+)|(p *-?/?(o)? *-?box)|post office box|((box|bin)|b) *(number|num|#)? *\d+|(num|number|#) *\d+)";
(?i)
是一个内联不区分大小写的标志。
【讨论】:
以上是关于将 po box javascript 正则表达式转换为 c# 正则表达式的主要内容,如果未能解决你的问题,请参考以下文章
1.3 正则表达式和python语言-1.3.8 创建字符集([ ])