首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在匹配的引号之间选择数据的Regex模式

在匹配的引号之间选择数据的Regex模式
EN

Stack Overflow用户
提问于 2014-01-13 21:55:24
回答 5查看 1.9K关注 0票数 6

假设我有以下字符串,我希望在以下字符串上运行正则表达式:

代码语言:javascript
复制
This is a test string with "quotation-marks" within it.
The "problem" I am having, per-se, is "knowing" which "quotation-marks"
go with which words.

现在,假设我想将所有-字符替换为引号,例如,用一个空格。我在想,我可以这样做,用正则表达式看上去如下:

代码语言:javascript
复制
Find What:      (\"[^"]*?)(\-)([^"]*?\")
Replace With:   $1 $3

我遇到的问题是,使用这种模式,它没有考虑到引号是打开还是结束语句。

因此,在上面的示例中,-字符在per-se中将被一个空格所取代,因为它位于两个引号之间,但在结束和开口标记之间--当我特别希望查看开头和结束标记之间的文本时。

您如何在这样一个正则表达式中解释这一点?

我希望这是合理的。

我正在使用VB / C# Regex。

为了完成这个问题(如果有必要的话,希望能更详细地阐述),我想要得到的最终结果是:

代码语言:javascript
复制
This is a test string with "quotation marks" within it.
The "problem" I am having, per-se, is "knowing" which "quotation marks"
go with which words.

谢谢!!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-01-13 21:59:35

为了解决这个问题,我绞尽脑汁,结果发现,指定non \B会起作用:

正则表达式

\B("[^"]*)-([^"]*")\B

替换

$1 $2

演示

http://regex101.com/r/dS0bH8

票数 6
EN

Stack Overflow用户

发布于 2014-01-13 22:12:06

与那些试图匹配HTML或打开和结束括号的人一样,regex只能匹配常规语言,并且知道哪个"是结束的,哪个是打开的,除了那些琐碎的情况之外,它是无法触及的。

编辑:正如Vasili的答案所示,有时可以这样做,但regex是解决这类问题的脆弱解决方案。

这样,您就可以将您的问题转换为琐碎的情况。由于您使用的是.NET,所以您可以简单地匹配每个引号字符串并使用接受匹配评估器的重载。

代码语言:javascript
复制
Regex.Replace(text, "\".*?\"", m => m.Value.Replace("-", " "))

测试:

代码语言:javascript
复制
var text = @"This is a test string with ""quotation-marks"" within it.
The ""problem"" I am having, per-se, is ""knowing"" which ""quotation-marks""
go with which words.";

Console.Write(Regex.Replace(text, "\".*?\"", m => m.Value.Replace("-", " ")));
//This is a test string with "quotation marks" within it.
//The "problem" I am having, per-se, is "knowing" which "quotation marks"
//go with which words. 
票数 9
EN

Stack Overflow用户

发布于 2014-01-13 22:07:39

从长远来看,与正则表达式不同,这样做的常规方法可能更易于维护:

代码语言:javascript
复制
public static String replaceDashInQuotes(this string source, String newValue)
{
    StringBuilder sb = new StringBuilder();

    bool inquote = false;

    for (int i = 0; i < source.Length; i++)
    {
        if (source[i] == '\"')
            inquote = !inquote;

        if (source[i] == '-' && inquote)
            sb.Append(newValue);
        else
            sb.Append(source[i]);
    }

    return sb.ToString();
}

然后使用它:

代码语言:javascript
复制
var s = @"This is a test string with ""quotation-marks"" within it.
    The ""problem"" I am having, per-se, is ""knowing"" which ""quotation-marks""
    go with which words.";

MessageBox.Show(s.replaceDashInQuotes(" "));
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21102161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档