表达式以匹配人类可读的打印格式

时间:2014-03-21 13:34:15

标签: c# regex

我正在使用以人类可读格式存储字符串的第三方数据库。我需要将这些字符串转换为网络地址。表格如下:

"X on Y (from Z) in session N"

X =打印机名称(1到多个单词)
Y =服务器名称(1个字)
Z =客户名称(1个字)
N =整数
"在Y"是可选的 如果"在"是打印机名称的一部分,然后我希望这会失败。

如果字符串包含"在Y"结果应该是:@"\\ServerName\PrinterName"

否则:@"\\ClientName\PrinterName"

你能提供一些执行任务的东西吗?避免正则表达式是很好的,因为我发现它们难以维护。但是,如果它是这项工作的最佳工具,那就没问题了。

样品:

"MY PRINTER NAME on MyServer (from MyWorkstation) in session 2"

这应该转换为:\\MyServer\My Printer Name

样本2:

"MY PRINTER NAME (from MyWorkstation) in session 2"

这应该转换为:\\MyWorkstation\My Printer Name

2 个答案:

答案 0 :(得分:2)

我完全同意正则表达式通常最终难以维护,特别是如果你不知道这些细节,但你的情况似乎是一个关于何时使用正则表达式和捕获组的百科全书的例子。

如下所示:

var match = Regex.Match(
   YOUR_STRING,
   @"(?<printer>.+?)(\s+on\s+(?<server>.+?))?\s+\(from\s+(?<client>.+?)\s*\)");
var result = String.Format(
   @"\\{0}\{1}",
   match.Groups["server"].Success
    ? match.Groups["server"].Value
    : match.Groups["client"].Value,
   match.Groups["printer"].Value);

答案 1 :(得分:1)

像这样简单:

// humanString = "MY PRINTER NAME on MyServer (from MyWorkstation) in session 2"    
var location = humanString.Contains(" on ") ? "MyServer" : "MyWorkstation";