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(found within Cells["MESA_ID"].Value) 或Puesto(found within Cells["Puesto"].Value)。它也不能匹配].Value == DBNull.Value && dr.Cells[(在 中找到["MESA_ID"].Value == DBNull.Value && dr.Cells["Puesto"]

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

4

4 回答 4

2

简单地使用消极的后视:

(?<!\[)

基本上,仅在前面没有 a 时才匹配字符串[示例here,代码如下:

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]);
}
于 2012-04-17T15:32:25.883 回答
1

为避免匹配嵌套在方括号内的引用,您需要检查以下其中一项是否为真:

  • 开始双引号之前的最后一个非空白字符不是[, 或
  • 结束双引号后的第一个非空白字符不是]

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

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

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

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

于 2012-04-17T15:38:00.557 回答
0

我认为是这样的:

^[^\"]*\"([^\"]*)\".*$
于 2012-04-17T15:37:30.593 回答
0

很多时候我必须解析源代码文件(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';

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

于 2015-12-10T09:41:17.470 回答