Удалите соответствующие квадратные скобки, но только те, которые не имеют пробела внутри скобки

Посмотрев на этот ответ: Удалите квадратные скобки, если содержимое в квадратных скобках не содержит пробелов

Это отлично работает для 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

По сути, ваш вопрос заключается в следующем: каков синтаксис .NET для ссылки на совпадающие группы в регулярной подстановке .

GSerg 08.04.2024 23:57

Я думаю тебе просто нужно Regex.Replace(str, @"\[(\w+)\]", "$1")

Charlieface 08.04.2024 23:59

@Charlieface [Date Started] => "Date Started" Думаю, если есть пробелы, их следует заключить в двойные кавычки (ОП, пожалуйста, поправьте меня, если я ошибаюсь).

bobble bubble 09.04.2024 00:01

@ user3297833 Ваша цель не ясна, условная замена текущего шаблона использует функцию Boost (условная замена). Логика вашего примера удаляет квадратные скобки, если внутри скобок нет пробелов (только символы слов), но остальные заключаются в двойные кавычки, например. если внутри есть место. Просьба уточнить...

bobble bubble 09.04.2024 00:10

@bobblebubble Если вы имеете в виду, что он будет заключен в кавычки из-за "$1", нет, это обычные кавычки C#. Думаю, @"[""\[](\w+)[\]""]" подойдет для случаев, когда сами значения в тексте заключены в кавычки, а не в скобки.

Charlieface 09.04.2024 00:10

В вашем примере вы просто удалили все открытые и закрытые скобки («[» и «]»). Что такое «необходимые скобки»?

Cary Swoveland 09.04.2024 04:41

@CarySwoveland Необходимые скобки — это те, в которых заключаются имена с пробелами. Они заменяются на "", остальные удаляются.

GSerg 09.04.2024 09:43
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
85
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Что-то вроде этого должно работать:

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.

R J 09.04.2024 00:29
Ответ принят как подходящий

Я считаю, что замена сразу не является обязательным требованием в этом вопросе. Почему бы просто не использовать 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] и т. д. Второе - [Дата начала].

Во второй замене я бы предпочел использовать отрицательный [^\]]* (как в образце ОП) вместо точки .+, чтобы не пропускать ].

bobble bubble 09.04.2024 11:04

В строках замены 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

К вашему сведению, только что заметил двойные кавычки в замене, поэтому исправил код и онлайн-демо.

Wiktor Stribiżew 09.04.2024 12:27

Другие вопросы по теме