我在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"]
中找到)
我希望我的意图明确。
答案 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)
要避免匹配引用的嵌套在方括号内,您需要检查以下其中一项是否为真:
[
或]
这可以使用此正则表达式完成:
(?<!\[\s*)\"[^"]*\"(?!\s*\])
它使用.NET regexp引擎的lookaround功能。
请注意,此表达式如何使用?
代替[^"]*
来避免引用字符串中不情愿的限定符.*?
。
答案 2 :(得分:0)
我认为是这样的:
^[^\"]*\"([^\"]*)\".*$
答案 3 :(得分: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';