RegEx для VB.net - PullRequest
       14

RegEx для VB.net

1 голос
/ 29 ноября 2010

У меня есть текстовый файл с содержимым

$NETS  
P3V3_AUX_LGATE;  PQ6.8 PU37.2   
U335_PIN1;  R3328.1 U335.1  
$END  

необходимо обновить в этом формате и сохранить обратно в другой текстовый файл

$NETS  
'P3V3_AUX_LGATE';  PQ6.8 PU37.2  
'U335_PIN1';  R3328.1 U335.1  
$END

ПРИМЕЧАНИЕ: количествостроки могут доходить до 10000 строк

Мое текущее решение - читать текстовый файл построчно, обнаруживать присутствие символа ";"и символ новой строки и делать изменения.

Прямо сейчас у меня есть переменная, которая содержит ВСЕ строки, есть ли другой способ что-то вроде Заменить через RegEx, чтобы сделать изменения без зацикливания каждой строки, так что я могу легковыведите результат

и уточните вопрос, какой из них более эффективен?

Ответы [ 3 ]

0 голосов
/ 29 ноября 2010

Попробуйте

ResultString = Regex.Replace(SubjectString, "^([^;\r\n]+);", "'$1';", RegexOptions.Multiline)

в вашей многострочной строке.

Это позволит найти любую строку (длиной в одну или несколько) в начале строки до первой точки с запятой, если она есть.и замените его цитируемым эквивалентом.

Это должно быть более эффективно, чем проходить по строке строка за строкой, как вы делаете сейчас, но если у вас есть сомнения, вам придется профилировать его.

0 голосов
/ 29 ноября 2010

Я бы сказал, да!это можно сделать с помощью регулярных выражений.Убедитесь, что у вас включена опция «многострочный», и создайте свое регулярное выражение, используя несколько групп захвата, чтобы упростить работу.

Однако я могу сказать, что это НЕ будет оптимальным вариантом.Так как вы упомянули количество строк, которые вы могли бы обработать, кажется разумным использование ресурсов с использованием потокового подхода вместо подхода в памяти.

Использование подхода Regex (и это заняло 15 минут, поэтому, пожалуйстане думаю, что это оптимальное решение, просто докажите, что оно будет работать)

    private static Regex matcher = new Regex(@"^\$NETS\r\n(?<entrytitle>.[^;]*);\s*(?<entryrest>.*)\r\n(?<entrytitle2>.[^;]*);\s*(?<entryrest2>.*)\r\n\$END\r\n", RegexOptions.Compiled | RegexOptions.Multiline);
    static void Main(string[] args)
    {
        string newString = matcher.Replace(ExampleFileContent, new MatchEvaluator(evaluator));
    }

    static string evaluator(Match m)
    {
        return String.Format("$NETS\r\n'{0}'; {1}\r\n'{2}'; {3}\r\n$END\r\n",
                              m.Groups["entrytitle"].Value,
                              m.Groups["entryrest"].Value,
                              m.Groups["entrytitle2"].Value,
                              m.Groups["entryrest2"].Value);            
    }

Надеюсь, это поможет,

0 голосов
/ 29 ноября 2010

Вы, вероятно, могли бы найти все совпадения, используя что-то вроде \w+;, но я не знаю, как вы могли бы заменить его, используя Regex.Replace , чтобы добавить 'с, но сохранить исходный матч.

Однако, если у вас уже есть одна переменная, вам не нужно снова читать файл, либо вы можете заставить свой код найти все ; s, а затем найти предыдущий символ новой строки для каждого, илиВы можете использовать String.Split на новых строках, чтобы разбить переменную, которую вы уже получили, на строки.И если вы хотите вернуть его к одной переменной, вы можете просто использовать String.Join .

Лично я обычно использовал бы String.Split (и, возможно, String.Join, если это необходимо).), поскольку, я думаю, это облегчит чтение кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...