regex和Openrefine中具有/n匹配的文本

regex和Openrefine中具有/n匹配的文本,regex,excel,openrefine,Regex,Excel,Openrefine,我正在尝试筛选在OpenRefine中有新行的文本 输入为: Them Spanish girls love me like I'm Aventura I'm the man, y'all don't get it, do ya? Type of money, everybody acting like they knew ya Go Uptown, New York City, bitch Them Spanish girls love me like I'm Aventura Tell Un

我正在尝试筛选在OpenRefine中有
新行的文本

输入为:

Them Spanish girls love me like I'm Aventura
I'm the man, y'all don't get it, do ya?
Type of money, everybody acting like they knew ya
Go Uptown, New York City, bitch
Them Spanish girls love me like I'm Aventura
Tell Uncle Luke I'm out in Miami, too
Them Spanish girls love me like I'm Aventura
预期结果将是:

Type of money, everybody acting like they knew ya
Go Uptown, New York City, bitch
Them Spanish girls love me like I'm Aventura
我正在尝试获取带有关键字的行以及前后的行

我使用标准正则表达式执行此操作的代码如下所示:

/(.*\n){2})^.*\b(纽约)\b.(.*\n){3})/m

但这在开放式精炼中不起作用。 我尝试了以下操作,但它只返回“null”

value.match(/.*(\newyork)/.*)

有人知道我该怎么做吗? 我真的需要遵守规定,所以我不能做任何事
赛前更换(/\n/,“”)

这款全新的手机比
match()
更加人性化

我认为这个正则表达式应该做到:

value.find(/(.*\n){1}.+New York.+(\n.*){1}/).join('\n')
结果:

如果出于某种原因,您更喜欢使用OpenRefine2.8,Python/Jython提供了一种替代方案:

import re
matches = re.findall(r".+?\n.+New York.+\n.+", value)
return "\n".join(matches)
结果:

match()
相比,这款全新手机的用户友好度更高

我认为这个正则表达式应该做到:

value.find(/(.*\n){1}.+New York.+(\n.*){1}/).join('\n')
结果:

如果出于某种原因,您更喜欢使用OpenRefine2.8,Python/Jython提供了一种替代方案:

import re
matches = re.findall(r".+?\n.+New York.+\n.+", value)
return "\n".join(matches)
结果:


如果您想完全避免使用正则表达式,只需阅读文本并在前面写一行,然后在后面写一行,这是您可以得到的,如果您在Excel中的单元格
A1
中写文本:

Public Sub TestMe()

    Dim inputString As String
    inputString = Range("A1")

    Dim lookForWord As String
    lookForWord = "New York"

    Dim inputArr As Variant
    inputArr = Split(inputString, vbLf)

    Dim line As Variant
    Dim previousLine As String
    Dim foundWord As Boolean
    Dim linesAfter As Long: linesAfter = 1

    For Each line In inputArr
        If InStr(1, line, lookForWord) Then
            previousLine = previousLine & vbCrLf & line
            foundWord = True
        Else
            If foundWord And linesAfter Then
                previousLine = previousLine & vbCrLf & line
                linesAfter = linesAfter - 1
            ElseIf linesAfter Then
                previousLine = line
            End If
        End If
    Next line

    If Not linesAfter Then Debug.Print previousLine

End Sub
Split()
将文本解析为如下数组:


linesAfter
变量可以告诉您应该在单词后显示多少行。

如果您想完全避免使用正则表达式,只需阅读文本并在前面写一行,然后在后面写一行,如果您在Excel中的单元格
A1
中写文本,您可以得到:

Public Sub TestMe()

    Dim inputString As String
    inputString = Range("A1")

    Dim lookForWord As String
    lookForWord = "New York"

    Dim inputArr As Variant
    inputArr = Split(inputString, vbLf)

    Dim line As Variant
    Dim previousLine As String
    Dim foundWord As Boolean
    Dim linesAfter As Long: linesAfter = 1

    For Each line In inputArr
        If InStr(1, line, lookForWord) Then
            previousLine = previousLine & vbCrLf & line
            foundWord = True
        Else
            If foundWord And linesAfter Then
                previousLine = previousLine & vbCrLf & line
                linesAfter = linesAfter - 1
            ElseIf linesAfter Then
                previousLine = line
            End If
        End If
    Next line

    If Not linesAfter Then Debug.Print previousLine

End Sub
Split()
将文本解析为如下数组:


linesAfter
变量可以告诉你单词后面应该显示多少行。

是不是
换行符
是一个
序列,你需要
\r\n
?是不是
换行符
是一个
序列,你需要
\r\n
兄弟,他在OpenRefine中问道,你想出了Excel。坚持openrefine有什么错?@iMitwe-坚持openrefine没有什么错。但是这个问题也是用Excel标记的,所以我提出了它。兄弟,他在OpenRefine中问道,你提出了Excel。坚持openrefine有什么错?@iMitwe-坚持openrefine没有什么错。但是这个问题也是用Excel标记的,因此我提出了它。我需要如何更改它,才能在前后获得两行?好的,我用
value.find(/(.*\n){2}.+newyork.+(\n.*{2}/).join('\n')
获得了它。谢谢我在正则表达式中发现了一个小错误。如果搜索的单词正好在新行之前,则不匹配<代码>+
与新行字符不匹配。你知道我怎么能在一行新词前匹配一个词吗?我尝试了
[\s\s]
,但这两个选项都匹配line@vinni使用多个正则表达式通常比构建一个覆盖所有情况的正则表达式要好。但是你可以这样做:
value.find(/(.*\n){2}.+newyork.+(\n.*{2}.[.+\n){2}.*newyork(\n.*{2}/i).join('\n')
(注意:我在正则表达式的末尾添加了一个“i”,所以这个是不区分大小写的。它找到“New York”和“New York”)啊,这是一个很好的提示。谢谢这似乎是可行的:
(.*\n){2}(.+|)Kreuzberg(.+|))(\n.{2}
你认为这有什么问题吗?我需要如何更改它,才能在前后两行中得到它?好的,我用
值得到它。查找(/(.*\n){2}.+New York.+(\n.*{2}/)。加入('\n')
。谢谢我在正则表达式中发现了一个小错误。如果搜索的单词正好在新行之前,则不匹配<代码>+与新行字符不匹配。你知道我怎么能在一行新词前匹配一个词吗?我尝试了
[\s\s]
,但这两个选项都匹配line@vinni使用多个正则表达式通常比构建一个覆盖所有情况的正则表达式要好。但是你可以这样做:
value.find(/(.*\n){2}.+newyork.+(\n.*{2}.[.+\n){2}.*newyork(\n.*{2}/i).join('\n')
(注意:我在正则表达式的末尾添加了一个“i”,所以这个是不区分大小写的。它找到“New York”和“New York”)啊,这是一个很好的提示。谢谢这似乎有效:
(.*\n){2}(.+|)Kreuzberg(.+|))(\n.*{2}
你认为这有问题吗?