Посмотрев на этот ответ: Удалите квадратные скобки, если содержимое в квадратных скобках не содержит пробелов
Это отлично работает для Notepad++, но когда я беру решение Notepad++ и помещаю его в C#, я получаю всевозможные неверные замены строк.
У меня есть это сейчас:
С# выглядит так:
str.Regex.Replace(str, @"\[(\w+)\]|\[([^\]]+)\]"), "(?1$1:(?2"$2"))")
Итак, если у меня есть это:
CREATE TABLE [dbo].[Event](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Date Started] [datetime] NOT NULL,
[StartTime] [time](7) NOT NULL,
[Description] [nvarchar](250) NULL,
[AudioLocation] [nvarchar](max) NOT NULL,
[PlayerLocation] [nvarchar](max) NOT NULL,
CONSTRAINT [PK_dbo.Event] PRIMARY KEY CLUSTERED
Я хочу удалить только ненужные скобки и получить это:
CREATE TABLE dbo.Event(
ID int IDENTITY(1,1) NOT NULL,
"Date Started" datetime NOT NULL,
StartTime time(7) NOT NULL,
Description nvarchar(250) NULL,
AudioLocation nvarchar(max) NOT NULL,
PlayerLocation nvarchar(max) NOT NULL,
CONSTRAINT PK_dbo.Event PRIMARY KEY CLUSTERED
Я думаю тебе просто нужно Regex.Replace(str, @"\[(\w+)\]", "$1")
@Charlieface [Date Started]
=> "Date Started"
Думаю, если есть пробелы, их следует заключить в двойные кавычки (ОП, пожалуйста, поправьте меня, если я ошибаюсь).
@ user3297833 Ваша цель не ясна, условная замена текущего шаблона использует функцию Boost (условная замена). Логика вашего примера удаляет квадратные скобки, если внутри скобок нет пробелов (только символы слов), но остальные заключаются в двойные кавычки, например. если внутри есть место. Просьба уточнить...
@bobblebubble Если вы имеете в виду, что он будет заключен в кавычки из-за "$1"
, нет, это обычные кавычки C#. Думаю, @"[""\[](\w+)[\]""]"
подойдет для случаев, когда сами значения в тексте заключены в кавычки, а не в скобки.
В вашем примере вы просто удалили все открытые и закрытые скобки («[» и «]»). Что такое «необходимые скобки»?
@CarySwoveland Необходимые скобки — это те, в которых заключаются имена с пробелами. Они заменяются на ""
, остальные удаляются.
Что-то вроде этого должно работать:
public static string RemoveBracketsIfSingleWord(string inputString)
{
// Regex pattern to match single words enclosed in square brackets without whitespace
string pattern = @"\[([^\]\s]+)\]";
// Replace matches with the captured word without brackets
return Regex.Replace(inputString, pattern, "$1");
}
Вы можете вызвать этот метод, как показано ниже:
string s =
""""
CREATE TABLE [dbo].[Event](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Date Started] [datetime] NOT NULL,
[StartTime] [time](7) NOT NULL,
[Description] [nvarchar](250) NULL,
[AudioLocation] [nvarchar](max) NOT NULL,
[PlayerLocation] [nvarchar](max) NOT NULL,
CONSTRAINT [PK_dbo.Event] PRIMARY KEY CLUSTERED
"""";
Console.WriteLine(RemoveBracketsIfSingleWord(s));
Я использую интерполированные строки, чтобы многострочный текст не выглядел искаженным.
Код не требует пояснений.
Должен добавить, что я не заменял скобки кавычками, как это происходит в вашем выводе. Однако это может быть простая замена квадратных скобок кавычками в контексте SQL.
Я считаю, что замена сразу не является обязательным требованием в этом вопросе. Почему бы просто не использовать Regex.Replace дважды:
using System;
using System.Text.RegularExpressions;
public class Program
{
public static void Main()
{
string str =
@"CREATE TABLE [dbo].[Event](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Date Started] [datetime] NOT NULL,
[StartTime] [time](7) NOT NULL,
[Description] [nvarchar](250) NULL,
[AudioLocation] [nvarchar](max) NOT NULL,
[PlayerLocation] [nvarchar](max) NOT NULL,
CONSTRAINT [PK_dbo.Event] PRIMARY KEY CLUSTERED";
string pattern = @"\[([\w.]+)\]";
str = Regex.Replace(str, pattern, "$1");
pattern = @"\[(.+)\]";
// or as per the suggestion in the comment below: pattern = @"\[([^\]]+)\]";
str = Regex.Replace(str, pattern, "\"$1\"");
Console.WriteLine(str);
}
}
Сначала заменяет [ID], [int], [PK_dbo.Event] и т. д. Второе - [Дата начала].
Во второй замене я бы предпочел использовать отрицательный [^\]]*
(как в образце ОП) вместо точки .+
, чтобы не пропускать ]
.
В строках замены Notepad++ указано: если соответствует группа 1, замените значением группы 1, если соответствует группа 2, замените совпадение значением группы 2, заключенным в двойные кавычки.
На C# вы можете написать
Regex.Replace(str, @"\[(\w+)]|\[([^]]+)]", m => m.Groups[1].Success ? m.Groups[1].Value : $"\"{m.Groups[2].Value}\"")
Посмотрите онлайн-демонстрацию C#:
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
public class Test
{
public static void Main()
{
var str = @"CREATE TABLE [dbo].[Event](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Date Started] [datetime] NOT NULL,
[StartTime] [time](7) NOT NULL,
[Description] [nvarchar](250) NULL,
[AudioLocation] [nvarchar](max) NOT NULL,
[PlayerLocation] [nvarchar](max) NOT NULL,
CONSTRAINT [PK_dbo.Event] PRIMARY KEY CLUSTERED";
var result = Regex.Replace(str, @"\[(\w+)]|\[([^]]+)]", m => m.Groups[1].Success ? m.Groups[1].Value : $"\"{m.Groups[2].Value}\"");
Console.WriteLine(result);
}
}
Выход:
CREATE TABLE dbo.Event(
ID int IDENTITY(1,1) NOT NULL,
"Date Started" datetime NOT NULL,
StartTime time(7) NOT NULL,
Description nvarchar(250) NULL,
AudioLocation nvarchar(max) NOT NULL,
PlayerLocation nvarchar(max) NOT NULL,
CONSTRAINT "PK_dbo.Event" PRIMARY KEY CLUSTERED
К вашему сведению, только что заметил двойные кавычки в замене, поэтому исправил код и онлайн-демо.
По сути, ваш вопрос заключается в следующем: каков синтаксис .NET для ссылки на совпадающие группы в регулярной подстановке .