【问题标题】:Expression to match human readable print format匹配人类可读打印格式的表达式
【发布时间】:2014-03-21 21:51:49
【问题描述】:

我正在使用以人类可读格式存储字符串的第 3 方数据库。我需要将这些字符串翻译成网络地址。形式如下:

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

X = 打印机名称(1 到多个单词)
Y = 服务器名称(1 个字)
Z = 客户名称(1 个字)
N = 整数
“在 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

【问题讨论】:

  • 你在哪里纠结这个?
  • 我不认为你的问题很清楚。您能否提供完整的示例字符串和预期结果?也许你到目前为止的代码?
  • “会话 1 中我的桌面上的打印机(来自 X)” - 您如何判断这是名为“我的桌面上的打印机”的打印机还是名为“PRINTER”的打印机和名为“我的办公桌”?
  • @mbeckish 我怀疑这是可能的。我无法更改系统存储字符串的方式(它的第 3 方)。
  • 您在哪里坚持使用非正则表达式解决方案?您必须至少能够提出@Belogix 建议的解决方案,对吧?你走了多远,你被困在哪里了?

标签: c# regex


【解决方案1】:

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

类似于以下内容:

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

【讨论】:

    【解决方案2】:

    像这样简单的事情:

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

    【讨论】:

    • 这只有在我已经从字符串中提取了“MyServer”和“MyWorkstation”时才有效。另外,我看不出这如何帮助我获得获得最终结果所需的打印机信息。
    • 这表明除了使用 RegEx 之外,您还必须解析字符串。所以,你可以做Contains 告诉你它是否是服务器/工作站。然后你可以做IndexOf 来获取“on”等的位置......有很多方法,只是强调简单。正则表达式是要走的路= @decPL 答案。但是您想避免这样显示一个简单的替代方案。
    猜你喜欢
    • 2015-02-24
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    相关资源
    最近更新 更多