正则表达式匹配字符串
本文关键字:字符串 正则表达式 | 更新日期: 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';
在在线正则表达式测试器中检查我的模式。