【问题标题】:Regex Match all characters between two strings正则表达式匹配两个字符串之间的所有字符
【发布时间】:2011-08-31 21:06:46
【问题描述】:

示例: “这只是\n个简单的句子”。

我想匹配“This is”和“sentence”之间的每个字符。应该忽略换行符。我不知道正确的语法。

【问题讨论】:

  • 您可能想指出您在什么环境中使用正则表达式。根据您所说的“忽略”换行符的确切含义,可能会有所不同。

标签: regex


【解决方案1】:

例如

(?<=This is)(.*)(?=sentence)

Regexr

我使用了lookbehind (?&lt;=)和lookbehind (?=),这样“This is”和“sentence”不包括在匹配中,但这取决于你的用例,你也可以简单地写This is(.*)sentence

这里重要的是您激活正则表达式引擎的“dotall”模式,以便. 匹配换行符。但是如何做到这一点取决于您的正则表达式引擎。

接下来是如果您使用.*.*?。第一个是贪婪的,会匹配到字符串中的最后一个“句子”,第二个是惰性的,会匹配到字符串中的下一个“句子”。

更新

Regexr

This is(?s)(.*)sentence

(?s) 在哪里打开 dotall 修饰符,使 . 匹配换行符。

更新 2:

(?<=is \()(.*?)(?=\s*\))

与您的示例“这是(一个简单的)句子”相匹配。请参阅此处Regexr

【讨论】:

  • @tchrist,对不起,我不得不查一下。我是否理解正确并且This is(?s)(.*)sentence 会起作用?
  • @stema:是的,这应该可以在大多数正则表达式库下启用“全点”模式。
  • 这主要解决了我的问题,但是如何在我的模式中包含空格字符?我尝试了以下方法:"(.*?)( ))" 以匹配序列末尾的 ")",但它不起作用。
  • 只有一个注释 - 正则表达式现在说 javascript 不支持后视
  • 有没有办法处理文本块中这种拆分的重复实例?例如:“这只是一个简单的句子。这是一些额外的东西。这只是一个简单的句子。这里还有一些东西。这只是一个简单的句子。”。目前它匹配整个字符串,而不是每个实例。
【解决方案2】:

需要惰性量词

重新提出这个问题,因为接受答案中的正则表达式对我来说似乎不太正确。为什么?因为

(?<=This is)(.*)(?=sentence)

将匹配my first sentence. This is my second 中的This is my first sentence. This is my second sentence.

See demo

您需要在两个lookarounds 之间添加一个惰性量词。添加? 会使明星变得懒惰。

这符合您的要求:

(?<=This is).*?(?=sentence)

See demo。我删除了不需要的捕获组。

DOTALL 模式以匹配换行符

请注意,在演示中设置了“点匹配换行模式”(又名)点全部(参见how to turn on DOTALL in various languages)。在许多正则表达式风格中,您可以使用在线修饰符 (?s) 对其进行设置,将表达式变为:

(?s)(?<=This is).*?(?=sentence)

参考

【讨论】:

  • 您对捕获组是正确的。不知道我为什么这样做。但是.*.*? 之间的区别也在我的回答(“更新”之前的段落)中进行了解释。所以我不认为我的回答是错误的。
  • @stema 对吹毛求疵感到抱歉,昨天浏览您的一些答案时,这是唯一让我抽搐的答案。 :) 我将第一行从 is incorrect 软化为 doesn't seem quite correct to me... 希望这不会让 抽搐,可能只是对如此高流量的正则表达式的看法不同答案应该是。
【解决方案3】:

试试This is[\s\S]*?sentence,在javascript中工作

【讨论】:

  • 这种方式如何进行惰性查找?
  • @AwQiruiGuo 同上。 [\s\S]*?(也称为:非贪婪通配符)
【解决方案4】:

这个:

This is (.*?) sentence

在 javascript 中工作。

【讨论】:

    【解决方案5】:

    使用这个:(?&lt;=beginningstringname)(.*\n?)(?=endstringname)

    【讨论】:

    • 不知道为什么所有的赞成票,这允许0-1换行,并且换行必须紧接在endstringname之前
    • 我发现删除日志行的开头(时间戳等)很有用。我使用新行作为开始字符串,使用“at”作为结束字符串。
    【解决方案6】:

    这对我有用(我正在使用 VS Code):

    对于: This is just\na simple sentence

    使用: This .+ sentence

    【讨论】:

    • 正是我想要的!谢谢!
    • 这比其他解决方案更具可读性和易记性
    【解决方案7】:

    如果有人在 Jenkins 上下文中寻找这样的例子。它解析 build.log,如果找到匹配项,则匹配失败。

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    node{    
        stage("parse"){
            def file = readFile 'build.log'
    
            def regex = ~"(?s)(firstStringToUse(.*)secondStringToUse)"
            Matcher match = regex.matcher(file)
            match.find() {
                capturedText = match.group(1)
                error(capturedText)
            }
        }
    }
    

    【讨论】:

      【解决方案8】:

      RegEx 使用 Java 方法匹配两个字符串之间的所有内容。

      List<String> results = new ArrayList<>(); //For storing results
      String example = "Code will save the world";
      

      让我们使用 Pattern 和 Matcher 对象来使用 RegEx (.?)*.

      Pattern p = Pattern.compile("Code "(.*?)" world");   //java.util.regex.Pattern;
      Matcher m = p.matcher(example);                      //java.util.regex.Matcher;
      

      由于 Matcher 可能包含多个匹配项,我们需要遍历结果并存储它。

      while(m.find()){   //Loop through all matches
         results.add(m.group()); //Get value and store in collection.
      }
      

      此示例将仅包含 “将保存” 字词,但在较大的文本中可能会找到更多匹配项。

      【讨论】:

        【解决方案9】:

        你可以简单地使用这个:\This is .*? \sentence

        【讨论】:

          【解决方案10】:

          我在这里搜索 regex 以在 print"string" 之间转换此打印语法,在 Python2 中的旧脚本中使用:print("string"),对于 Python3。效果很好,否则使用 2to3.py 进行额外的转换。这是我对其他人的解决方案:

          在 Regexr.com 上试用(由于某种原因在 NP++ 中不起作用):

          find:     (?<=print)( ')(.*)(')
          replace: ('$2')
          

          对于变量:

          (?<=print)( )(.*)(\n)
          ('$2')\n
          

          对于标签和变量:

          (?<=print)( ')(.*)(',)(.*)(\n)
          ('$2',$4)\n
          

          How to replace all print "string" in Python2 with print("string") for Python3?

          【讨论】:

            【解决方案11】:

            有一种方法可以处理文本块中这种拆分的重复实例吗?例如:“这只是一个简单的句子。这是一些额外的东西。这只是一个简单的句子。这里还有一些东西。这只是一个简单的句子。”。要匹配每个实例而不是整个字符串,请使用以下代码:

            data = "This is just\na simple sentence. Here is some additional stuff. This is just\na simple sentence. And here is some more stuff. This is just\na simple sentence."
            
            pattern = re.compile('This is (?s).*? sentence')
            
            for match_instance in re.finditer(pattern, data):
                do_something(match_instance.group())
            

            【讨论】:

            • 如果我想在两个连续的之间获取文本怎么办?这只是\n个简单的句子。模式?
            【解决方案12】:

            我是这样做的:
            这对我来说比试图找出必要的特定正则表达式更容易。

            int indexPictureData = result.IndexOf("-PictureData:");
            int indexIdentity = result.IndexOf("-Identity:");
            string returnValue = result.Remove(indexPictureData + 13);
            returnValue = returnValue + " [bytecoderemoved] " + result.Remove(0, indexIdentity); ` 
            

            【讨论】:

              【解决方案13】:

              要在 VIM 中快速搜索,您可以使用 在 Vim 控制提示符下:/This is.*\_.*sentence

              【讨论】:

                【解决方案14】:

                崇高文本 3x

                在崇高的文本中,您只需写下您感兴趣的两个单词,例如在您的情况下它是

                “这是”和“句子”

                你在两者之间写.*

                This is .* sentence

                这应该对你有好处

                【讨论】:

                • 不确定问题是关于如何在 Sublime Text 中执行此操作,但主要适用于 Sublime Text。当“This is”和“sentence”之间恰好有换行符时,它不起作用。此外,sublime text 还会选择“This is”和“Sentence”,而不仅仅是这两个字符串之间的文本。
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-02-04
                • 1970-01-01
                相关资源
                最近更新 更多