Вы хотите негативное выражение внешнего вида. Они выглядят как (?<!pattern)
, так:
(?<!\[[\d ]+\]\.)\[?ABC\]?
Обратите внимание, что это не принуждать подходящую пару квадратных скобок ABC; он просто позволяет использовать опциональный открытый кронштейн до и после этого закрывать скобы. Если вы хотите, чтобы заставить соответствующие пары или ничего, вы должны использовать чередование:
(?<!\[[\d ]+\]\.)(?:ABC|\[ABC\])
Это использует не захватывая круглые скобки, чтобы разграничить чередование. Если вы хотите захватить ABC, вы можете превратить это в группу захвата.
ETA: Причина, по которой первое выражение, похоже, терпит неудачу, заключается в том, что оно соответствует ABC]
, которому не предшествует запрещенный текст. Открытая скобка [
не является обязательной, поэтому она просто не соответствует этому. Обойти это переложить дополнительный открытый кронштейн [
в отрицательный взгляд, за утверждение, например, так:
(?<!\[[\d ]+\]\.\[?)ABC\]?
пример того, что он соответствует и не делает:
[123].[ABC]: fail (expected: fail)
[123 456].[ABC]: fail (expected: fail)
[123.ABC: match (expected: match)
matched: ABC
ABC: match (expected: match)
matched: ABC
[ABC]: match (expected: match)
matched: ABC]
[ABC[: match (expected: fail)
matched: ABC
Попытка сделать наличие открытой скобки [
силы комбинационной близко кронштейн ]
, как задумано второй шаблон, сложнее, но это похоже на работу:
(?:(?<!\[[\d ]+\]\.\[)ABC\]|(?<!\[[\d ]+\]\.)(?<!\[)ABC(?!\]))
Пример того, что он соответствует и не делает:
[123].[ABC]: fail (expected: fail)
[123 456].[ABC]: fail (expected: fail)
[123.ABC: match (expected: match)
matched: ABC
ABC: match (expected: match)
matched: ABC
[ABC]: match (expected: match)
matched: ABC]
[ABC[: fail (expected: fail)
примеры были созданы с помощью этого кода:
// Compile and run with: mcs so_regex.cs && mono so_regex.exe
using System;
using System.Text.RegularExpressions;
public class SORegex {
public static void Main() {
string[] values = {"[123].[ABC]", "[123 456].[ABC]", "[123.ABC", "ABC", "[ABC]", "[ABC["};
string[] expected = {"fail", "fail", "match", "match", "match", "fail"};
string pattern = @"(?<!\[[\d ]+\]\.\[?)ABC\]?"; // Don't force [ to match ].
//string pattern = @"(?:(?<!\[[\d ]+\]\.\[)ABC\]|(?<!\[[\d ]+\]\.)(?<!\[)ABC(?!\]))"; // Force balanced brackets.
Console.WriteLine("pattern: {0}", pattern);
int i = 0;
foreach (string text in values) {
Match m = Regex.Match(text, pattern);
bool isMatch = m.Success;
Console.WriteLine("{0}: {1} (expected: {2})", text, isMatch? "match" : "fail", expected[i++]);
if (isMatch) Console.WriteLine("\tmatched: {0}", m.Value);
}
}
}
Я изменил 'DEF' в вашей второй«после»строки в' ABC 'чтобы указать, что никакой замены не произошло. Это вы имели в виду, не так ли? –
Да. Просто убедитесь, что вы обращали внимание. –