从原始文本中提取名称
Extract the names from raw text
我正在处理一个问题,我有一个原始文本,其中有一个像 Some Name (vs|v.) Some other name
这样的模式,我想提取这些名称,即
我试过了
(first group) (vs|v.) (second group)
使用正则表达式来捕捉 vs 两边的词,但它只捕捉到一个词而不是完整的名字,我不知道在提取 vs
两边的名字时在哪里停下来名称与其他文本几乎相同
任何帮助将不胜感激
文本类似于
person concerned applies, the Assessing Officer has to issue an appropriate certificate [Cf.
<em>L. Hirday Narain vs Income Tax Officer,
</em>(1970) 78 ITR 26(SC) ].
所以这里的正则表达式应该能捕捉到
L. Hirday Narain
和 Income Tax Officer
这应该适用于以下正则表达式:
/([\w&;.][\w&;. ]+[\w&;.]) v. ([\w&;. ]+[\w&;.])[ ,<\n.]/gm
查看此处的实时示例:
https://regex101.com/r/zP8jM0/4
我们有两个捕获组,除以模式“v.”,它必须在要匹配的组之间。
在第一个捕获组中,我们以:[\w&;.]
这会捕获一个字符,它是 \w (= a-z, A-Z, 0-9, _)) 或 &;.
然后我们捕获一个或多个 (+) 个字符:[\w&;。 ]+
这是同一组,但有额外的“”
我们终于抓到了:[\w&;.]
这会捕获一个字符,它是 \w (= a-z, A-Z, 0-9, _)) 或 &;.
通过在开头和结尾使用不带“”的字符组,我们可以确定找到的名称没有前导或尾随空格。
第二个捕获组(名称 2)的工作方式略有不同。
我们开始于:[\w&;。 ]
这会捕获多个字符,它们是 \w (= a-z, A-Z, 0-9, _) 或 & ;.
我们以确保结束该组,它没有任何尾随空格:[\w&;.]
这会捕获一个字符,它是 \w (= a-z, A-Z, 0-9, _)) 或 &;.
最后,我们有了某种停止模式:[ ,<\n.]
这确保名称在任何标记 (<) 之前或在新行开始 (\n) 或句子结束 (,.)
时结束
一般来说,一个简单的解决方案是将 " vs "
上的文本拆分为 delimiter
。
首先,像这样提取标签之间的文本
var bigText = "erson concerned applies, the Assessing Officer has to issue an appropriate certificate [Cf.<em>L. Hirday Narain vs Income Tax Officer,\n</em>(1970) 78 ITR 26(SC) ]. ";
var a = "";
var names = [];
bigText.replace(
/<em>(.*?),\n<\/em>/g,
function () {
a = arguments[1];
names = a.split(/ vs /);
console.log(names);
}
);
会给你结果数组 names
as
["L. Hirday Narain", "Income Tax Officer"]
我在 notepad++ 中尝试了您的示例文本,假设在第二个名称后有一个逗号,我能够通过以下正则表达式获得结果
(.+?)vs(.+),
我正在处理一个问题,我有一个原始文本,其中有一个像 Some Name (vs|v.) Some other name
这样的模式,我想提取这些名称,即
我试过了
(first group) (vs|v.) (second group)
使用正则表达式来捕捉 vs 两边的词,但它只捕捉到一个词而不是完整的名字,我不知道在提取 vs
两边的名字时在哪里停下来名称与其他文本几乎相同
任何帮助将不胜感激
文本类似于
person concerned applies, the Assessing Officer has to issue an appropriate certificate [Cf.
<em>L. Hirday Narain vs Income Tax Officer,
</em>(1970) 78 ITR 26(SC) ].
所以这里的正则表达式应该能捕捉到
L. Hirday Narain
和 Income Tax Officer
这应该适用于以下正则表达式:
/([\w&;.][\w&;. ]+[\w&;.]) v. ([\w&;. ]+[\w&;.])[ ,<\n.]/gm
查看此处的实时示例: https://regex101.com/r/zP8jM0/4
我们有两个捕获组,除以模式“v.”,它必须在要匹配的组之间。
在第一个捕获组中,我们以:[\w&;.] 这会捕获一个字符,它是 \w (= a-z, A-Z, 0-9, _)) 或 &;.
然后我们捕获一个或多个 (+) 个字符:[\w&;。 ]+ 这是同一组,但有额外的“”
我们终于抓到了:[\w&;.] 这会捕获一个字符,它是 \w (= a-z, A-Z, 0-9, _)) 或 &;.
通过在开头和结尾使用不带“”的字符组,我们可以确定找到的名称没有前导或尾随空格。
第二个捕获组(名称 2)的工作方式略有不同。
我们开始于:[\w&;。 ] 这会捕获多个字符,它们是 \w (= a-z, A-Z, 0-9, _) 或 & ;.
我们以确保结束该组,它没有任何尾随空格:[\w&;.] 这会捕获一个字符,它是 \w (= a-z, A-Z, 0-9, _)) 或 &;.
最后,我们有了某种停止模式:[ ,<\n.] 这确保名称在任何标记 (<) 之前或在新行开始 (\n) 或句子结束 (,.)
时结束一般来说,一个简单的解决方案是将 " vs "
上的文本拆分为 delimiter
。
首先,像这样提取标签之间的文本
var bigText = "erson concerned applies, the Assessing Officer has to issue an appropriate certificate [Cf.<em>L. Hirday Narain vs Income Tax Officer,\n</em>(1970) 78 ITR 26(SC) ]. ";
var a = "";
var names = [];
bigText.replace(
/<em>(.*?),\n<\/em>/g,
function () {
a = arguments[1];
names = a.split(/ vs /);
console.log(names);
}
);
会给你结果数组 names
as
["L. Hirday Narain", "Income Tax Officer"]
我在 notepad++ 中尝试了您的示例文本,假设在第二个名称后有一个逗号,我能够通过以下正则表达式获得结果
(.+?)vs(.+),