RegEx匹配字符串

时间:2012-04-17 15:27:41

标签: c# .net regex

我在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"]中找到)

匹配

我希望我的意图明确。

4 个答案:

答案 0 :(得分:2)

简单使用负面的后视:

(?<!\[)

基本上,只在不在[之前匹配字符串。 Example 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]);
}

答案 1 :(得分:1)

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

  • 开头双引号前面的最后一个非空白字符是 a [
  • 结束双引号后面的第一个非空白字符是 a ]

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

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

它使用.NET regexp引擎的lookaround功能。

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

答案 2 :(得分:0)

我认为是这样的:

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

答案 3 :(得分:0)

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

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

  • 捕获以单引号开头的所有内容:['"]
  • 如果前面有正斜杠(escape \运算符),则可能后跟零个或多个字符,即使是相同的引号符号(不被视为字符串的结尾) ):(\\\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';

Check my pattern in an online regex tester