【问题标题】:Check if string contains single backslashes with regex使用正则表达式检查字符串是否包含单个反斜杠
【发布时间】:2017-06-20 12:36:00
【问题描述】:

我已经尝试解决这个问题很长时间了,但我就是做不到。

它可以是任何字符串,但这是一个示例:

"\This string \contains some\ backslashes\"

我需要制作一个正则表达式,我可以用它来检查字符串是否包含单个反斜杠。

然后我需要将给定的字符串转换为(我可以进行转换):

"\\This string \\contains some\\ backslashes\\"

然后使用正则表达式检查字符串是否不再包含单个反斜杠。

顺便说一句,我不必为此使用正则表达式,我只需要能够以某种方式检查字符串。

【问题讨论】:

  • 我相信你不能这样做,因为这些转义字符是由编译器处理的,并且在程序运行时已经消失了。 Afaik,您无法检测到源代码中字符串文字的“原始”形式是什么。
  • this demo。它可能会给您一些想法或澄清我们对您的问题的(错误)理解。
  • 我真的不知道如何用另一种方式来表述这个问题。我只需要一个正则表达式来检查一个字符串是否包含单个反斜杠。到目前为止,我想出的是一个看起来像这样的正则表达式: [^\\]\\[^\\] 但它没有找到开始和结束字符串的反斜杠。
  • 好的,试试.replaceAll("""(?<!\\)\\(?!\\)""", """\\\\""")。那对你有用吗?还是您只需要 (?<!\\)\\(?!\\) 正则表达式进行任何其他检查?
  • 另外,如果你需要检查一个字符串是否包含一个反斜杠,你可以使用类似ideone.com/P1SXII的东西。

标签: regex scala backslash


【解决方案1】:

您似乎只想检查字符串是否部分匹配正则表达式模式,即,它是否包含文字反斜杠,前后没有反斜杠。

使用

(?<!\\)\\(?!\\)

请参阅regex demo

示例 Scala 代码:

val s = """"\This string\\ \contains some\ backslashes\""""
val rx = """(?<!\\)\\(?!\\)""".r.unanchored
val ismatch = s match {
  case rx(_*) => true
  case _ => false
}
println(ismatch)

请参阅Scala online demo

注意:

  • """(?&lt;!\\)\\(?!\\)""".r.unanchored - 此行声明了一个正则表达式对象并使模式取消锚定,因此match 块不再需要完整的字符串匹配
  • match 内部,我们使用case rx(_*),因为模式本身没有定义捕获组
  • 该模式的意思是:匹配一个反斜杠 (\\),该反斜杠前面没有反斜杠 ((?&lt;!\\)),后面也没有反斜杠 ((?!\\))。

【讨论】:

    【解决方案2】:

    不确定您在问什么.. 您是在问如何编写一个字符串文字来表示您作为示例给出的字符串?您可以使用另一个反斜杠转义反斜杠,也可以使用三引号。

    scala> "\\This string \\contains some\\ backslashes\\"
    String = \This string \contains some\ backslashes\
    
    scala> """\This string \contains some\ backslashes\"""
    String = \This string \contains some\ backslashes\
    

    并使用相同的技术替换反斜​​杠。

    scala> "\\This string \\contains some\\ backslashes\\".replace("\\","\\\\")
    String = \\This string \\contains some\\ backslashes\\
    

    scala> """\This string \contains some\ backslashes\""".replace("""\""","""\\""")
    String = \\This string \\contains some\\ backslashes\\
    

    但我有一种感觉,你想做其他事情,比如验证输入。也许您可以提供更多上下文?

    【讨论】:

    • 我创建了一个转换字符串的方法。我需要正则表达式(或其他一些测试方法)来单元测试这个方法。因此,在我在单元测试中调用该方法之前,我想确保输入字符串包含单个反斜杠,然后在对字符串进行方法调用之后,我想检查所有出现的单个反斜杠是否已被双反斜杠替换。我想我解释这个问题很糟糕:P
    • 字符串的转换?从什么转换成什么?而且,似乎 String 的 contains 方法,如 "abdc".contains("\\") 不适合你?您是否收到错误或意外结果?
    【解决方案3】:

    试试这个

    val s = """\This string \contains some\ backslashes\"""
    
    s.replaceAll("""\\""","""\\\\""")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-11
      • 2015-07-14
      • 2021-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多