正则表达式匹配字符串

3

我有一个与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"]中找到)。希望我已经清楚表达了我的意图。

可能重复的问题 https://dev59.com/KFTTa4cB1Zd3GeqPvcju - Andrii Startsev
4个回答

2

简单地使用负向回顾后发现:

(?<!\[)

基本上,只有在没有[前导时才匹配字符串。 这里是示例,代码如下:

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]);
}

非常感谢,它运行得很好。它匹配:if (dr.Cells["MESA_ID"].Value == DBNull.Value && dr.Cells["Puesto"].Value == DBNull =>>> ].Value == DBNull.Value && dr.Cells[. 我该如何表明我不想让字符串以]开头并以[结尾? - Müsli
@Müsli:更新您的问题,提供几个您正在过滤的示例内容版本,我将设计出适用于大多数情况的解决方案。还请确保概述您想要找到/返回的内容。 - Brad Christie
@Müsli:试试这个正则表达式 @"(?<!\[)\x22(?!\])(.*?)\x22" - Brad Christie

1
为了避免匹配括号内的带引号内容,需要检查以下其中之一是否成立:
  • 在双引号前的最后一个非空白字符不是 [ ,或者
  • 在双引号后的第一个非空白字符不是]
可以使用以下正则表达式完成此操作:
(?<!\[\s*)\"[^"]*\"(?!\s*\])

它使用了 .NET 正则表达式引擎的 lookaround 特性。

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


这可以完美地捕获方括号内的内容(http://regexr.com?30m05)。 - Brad Christie
@BradChristie 谢谢,我忘记在\s后面加星号了。现在已经修复了。 - Sergey Kalinichenko
确实。我也想到了,但是还是想给你一个修复的机会。那句老话怎么说来着?量词在资格限定语之上?;p - Brad Christie

0

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

这是我如何捕获所有字符串的方法:/(['"])(\\\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';

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


0
我认为应该是这样的:
^[^\"]*\"([^\"]*)\".*$

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接