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

本文关键字:打印 格式 人类 表达式 | 更新日期: 2023-09-27 17:51:11

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

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

X =打印机名称(1到多字)
Y =服务器名(1字)
Z =客户端名称(1字)
N = integer
"on Y"是可选的
如果" on "是打印机名称的一部分,那么我预计这将失败。

如果字符串包含"on Y",结果应该是:@"''ServerName'PrinterName"

否则:@"''ClientName'PrinterName"

你能提供一些东西来完成这项任务吗?最好避免使用Regex,因为我发现它们很难维护。但是,如果它是这项工作的最佳工具,那就好了。

示例:


"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

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

我完全同意正则表达式通常难以维护,特别是在您不知道其细节的情况下,但是您的案例似乎是关于何时使用正则表达式和捕获组的百科全书式示例。

类似如下:

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);

像这样简单:

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