【问题标题】:Regular expression, selects a portion of text inside other正则表达式,选择其他文本中的一部分
【发布时间】:2016-03-26 16:51:03
【问题描述】:

我对下一个任务有点不知所措。我希望在 " 之间选择一个文本,它在标签内但不在标签外,即另一个选择内的选择。

我有下一个标签: 并且我只想在 " 和标签之间选择一个文本。

应该选择" 未选择 "也选择" |> "未选择"

我想了一些

(\<\|)(\").*?(\")(\|\>)   

但它不起作用。

【问题讨论】:

  • @nicael 你读过这个问题吗? OP 仅在其内部标签 &lt;| |&gt; 时才希望在引号之间选择值
  • 是的,它不是重复的,我不想选择 " " 内的任何文本,我想选择 " " 和 及其 JS 和 C#
  • @M.kazemAkhgary 没关系,解决方案很容易调整。您只需想象 &lt;||&gt; 是另一个引号并改进正则表达式。
  • @nicael 您愿意详细说明简单的解决方案吗?
  • @nicael 我认为它不容易调整。如果它对你来说很容易,并不意味着它对每个人都容易。

标签: javascript c# regex


【解决方案1】:

我已经使用两个正则表达式正确匹配。

var input = '<|a "b"|>c "d"ef<|"g"h "i"|>"j"k l';
var output=input.match(/<\|(.*?)\|>/g)
   .map(function(x){return x.match(/"(.*?)"/g)})
alert(output)

如您所见,正确匹配“b”、“g”、“i”。

原理:

  1. 查找&lt;||&gt;之间的所有文本匹配
  2. 对于第一步中的每个匹配项,查找两个引号之间的文本匹配项。

(使用来自linked 问题的second answer 的正则表达式)

【讨论】:

  • 贪婪的*量词会吃掉第一对&lt;||&gt;如果有几个:regex101.com/r/wI4lF2/1
  • @Jan hm,这似乎是问题所在。使用 OP 的示例进行测试。
  • @Jan 编辑:作为回答提到的javascript,使用它:)
【解决方案2】:

这将在单个正则表达式中完成工作:

(?&lt;=&lt;\|[^&gt;]*)"[^"]*"

除了nicael的评论:输入字符串可能没有正确标记。这将有所帮助:

(?&lt;=&lt;\|((?!\|&gt;).)*)"[^"]*"

如果你需要在 JavaScript 中使用它:

(?=("[^"]*"[^"]*)*$)"[^"]*"(?=((?!&lt;\|).)*\|&gt;)

【讨论】:

  • 看起来不错,但为什么它不起作用there?在移动设备上,无法显示错误。
  • 在您的正则表达式中发现问题:this 不正确匹配。我将第一个 |> 替换为 > ,这应该会导致“未选择”匹配,尽管它没有。
  • @nicael 我添加了一个正则表达式来解决第二个问题。我的正则表达式将与 .Net 正则表达式一起使用。您的第一个示例显示 JavaScript 中不允许查看断言。对不起。那是什么?有一个不支持向后看的正则表达式?我试图找到一个适用于前瞻断言的解决方案。
  • @nicael (?=("[^"]*"[^"]*)*$)"[^"]*"(?=((?!&lt;\|).)*\|&gt;) 会是一个可能的解决方案吗?如果您删除第一个关闭令牌的|,这看起来很奇怪,但也许没关系。
  • 这个好像很完美!
【解决方案3】:

I can't think of a regular expression to match what you want in one shot 但我看不出不使用两个正则表达式的原因:

var SAMPLE_STRING = '<| blah blah blah "should be selected" not selected "select it too" |> "not selected too" <| "select it" do not select this |> "don\'t select this one too"';

var matchAll = function matchAll(regexp, str) {
  var lastIndex = regexp.lastIndex;
  regexp.lastIndex = 0;
  var result = [];
  var match;
  while ((match = regexp.exec(str)) !== null) {
    result.push(match[0]);
  }
  regexp.lastIndex = lastIndex; // so this method won't have any side effects on the passed regexp object
  return result;
};

var withinTagsRegexp = /<\|([^|]|\|[^>])+\|>/g;
var withinQuotesRegexp = /"[^"]+"/g;

var withinTagsAndQuotes = [].concat.apply([], // flattens the following
    matchAll(withinTagsRegexp, SAMPLE_STRING).map(
    matchAll.bind(undefined, withinQuotesRegexp)));

// show the result

var resultTag = document.getElementById('result');

withinTagsAndQuotes.forEach(function(entry) {
  var p = document.createElement('p');
  p.innerHTML = entry;
  resultTag.appendChild(p);
});
&lt;div id="result"&gt;&lt;/div&gt;

【讨论】:

    【解决方案4】:

    尝试使用后视和前瞻:

    (?<=\<\|.)(\"[^"]*\")(?=.\|\>)
    

    这是live demo

    【讨论】:

    • @fardjad 哦,你是对的。 nicael 的回答在你的例子中也失败了。你有更好的建议吗?
    • 是的,但不是使用单个正则表达式,我会在一分钟内发布我的解决方案。
    • 这很奇怪...我希望这仅匹配 fardjad 示例中的 "test" 部分(而不是经常匹配),因为您只允许在 | 和开头 @ 之间使用一个字符987654327@,并且在结尾的"| 之间只有一个字符。 pythex.org 似乎同意...是 Debuggex 错误、Pythex 错误还是其他完全不同的东西?
    猜你喜欢
    • 2018-11-29
    • 2021-12-28
    • 2011-01-06
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多