正则表达式匹配字符串

本文关键字:字符串 正则表达式 | 更新日期: 2023-09-27 18:31:20

我有一个与 c# 中的正则表达式相关的问题。

我想在 " 字符之间查找文本。例:

 Enum resultado = SPDialogBox.Instance.show<ACTION_ENUMs.TORNEO_SORTEAR>("Esto es una prueba");

比赛: Esto es una prueba

但是,在这个例子中

Enum resultado = SPDialogBox.Instance.show<ACTION_ENUMs.TORNEO_SORTEAR>("Esto es una prueba");
pKR_MESAPUESTOASIGNACION.CONFIGTORNEO_ID = Valid.GetInt(dr.Cells["CONFIGTORNEO_ID"].Value);

匹配:Esto es una prueba但不得匹配CONFIGTORNEO_ID,因为它写在方括号([]之间)

简而言之,我想匹配双引号 (") 字符之间的字符串,但该字符串不得写在方括号 ([] 之间)。

这是我的代码:

var pattern = "'"(.*?)'"";
var matches = Regex.Matches(fullCode, pattern, RegexOptions.Multiline);
foreach (Match m in matches)
{
    Console.WriteLine(m.Groups[1]);
}

该模式匹配"字符之间的所有字符串,但是如何修改模式以排除在方括号之间的字符串?

--编辑---

这是另一个例子:

List<String> IdSorteados = new List<String>();
int TablesToSort = 0;
foreach (UltraGridRow dr in fg.hfg_Rows)
{
    if (dr.Cells["MESA_ID"].Value == DBNull.Value && dr.Cells["Puesto"].Value == DBNull.Value && !Valid.GetBoolean(dr.Cells["BELIMINADO"].Value) && (Valid.GetBoolean(dr.Cells["Seleccionado"].Value) || SortearTodo))
        TablesToSort++;
    }

表达式不得匹配MESA_ID(在 Cells["MESA_ID"].Value 中找到)或Puesto(在 Cells["Puesto"].Value 中找到)。它也不得与].Value == DBNull.Value && dr.Cells[匹配(在["MESA_ID"].Value == DBNull.Value && dr.Cells["Puesto"]中找到)

我希望我已经表明了我的意图。

正则表达式匹配字符串

简单使用负面的后视:

(?<!'[)

基本上,仅当字符串前面没有[时才匹配。此处的示例,代码如下:

String fullCode = "Enum resultado = SPDialogBox.Instance.show<ACTION_ENUMs.TORNEO_SORTEAR>('"Esto es una prueba'");'r'n"
                + "pKR_MESAPUESTOASIGNACION.CONFIGTORNEO_ID = Valid.GetInt(dr.Cells['"CONFIGTORNEO_ID'"].Value);";
String pattern = @"(?<!'[)'x22(.*?)'x22";
var matches = Regex.Matches(fullCode, pattern, RegexOptions.Multiline);
foreach (Match m in matches)
{
    Console.WriteLine(m.Groups[1]);
}

为避免匹配嵌套在方括号内的引号,您需要检查以下情况之一是否为真:

  • 左双引号前面的最后一个非空格字符不是[,或者
  • 右双引号后的第一个非空格字符不是]

这可以使用此正则表达式完成:

(?<!'['s*)'"[^"]*'"(?!'s*'])

它使用 .NET 正则表达式引擎的环顾功能。

请注意此表达式如何通过使用 [^"]* 而不是 .*? 来避免引号字符串内的不情愿限定符?

我认为是这样的:

^[^'"]*'"([^'"]*)'".*$

很多时候我必须解析源代码文件(php|cpp|java|js|css|etc)并做一些正则表达式替换。为了避免替换某些字符串/消息,我在进行替换之前屏蔽了所有字符串,因此我必须捕获所有可能的字符串并屏蔽它们。

这是我捕获所有字符串的方式:/(['"])('''1|.)*?'1/gm这意味着:

  • 捕获以单引号|双引号开头的所有内容:['"]
  • 它可能后跟零个或多个字符,如果前面有正斜杠(转义'运算符),甚至可以跟着相同的引号(不被视为字符串的结尾): ('''1|.)*
  • 确保上述模式在第一次出现时停止,而不是在其最后一次匹配时停止(即不要贪婪): ?
  • 最后,我们的字符串在后面跟着相同的起始单引号|双引号时结束: '1

我希望全局搜索(捕获所有可能的匹配项)和多行搜索(字符串可能不会在 CRLF 分隔的新行上继续,对吧?

也许您不仅有兴趣查找,还有兴趣捕获这些字符串组,因此请确保将给出最终模式的('''1|.)*?放在组分隔符中:

([''"])(('''1|.)*?)'1

捕获的字符串示例:

defined ( 'WP_DEBUG' ) || define( ''WP_DEBUG', true );
echo 'class="input-text card-number" type="text" maxlength="20"';
echo 'How are you? I''m fine, thank you';

在在线正则表达式测试器中检查我的模式。