2016-07-26 8 views
1

ich einen String etwas wie dieses:die nicht in Anführungszeichen

Wie wissen wir, dass die Entwicklung von „der“ Nation der Menschen abhängt sowie Regierung des Landes.

Ich brauche eine Regex, um ein bestimmtes Wort zu finden sagen "das" nicht in Anführungszeichen eingeschlossen. Nach einigen zufälligen Versuchen fand ich das ((\.?) (The)). Dies erkennt das Wort "das" in doppelten Anführungszeichen sowie zwischen Anführungszeichen. Aber ich möchte nur das Wort "the" ohne Anführungszeichen in der obigen Zeichenfolge. Ich kann wirklich nicht darauf kommen, selbst nach so vielen Versuchen.

Was ich will, ist alle the, die außerhalb doppelte Anführungszeichen und repalce sie mit 'THE' ersetzen, aber keine Änderung in Anführungszeichen. Also, wenn, Benutzer schreibt sagen, the, tHE, ThE oder eine beliebige Kombination) gefunden außerhalb von Anführungszeichen wollte es nur in THE konvertieren.

+0

Dies ist sehr einfach: match was Sie nicht wollen (dh '" [^ "] *" ') und übereinstimmen und erfassen, was Sie brauchen' (die) '=>' new Regex (@ "" "[^ ""] * "" | (the) ")', und die 'Gruppen [1]' enthalten alle notwendigen Daten. –

+0

@ WiktorStribiżew danke für die Hilfe. Aber, können Sie bitte erklären, wie ich zwei Gruppen als trennen kann Die Regex wählt den Text, der außerhalb und innerhalb von Anführungszeichen steht. –

+0

Was ist das erwartete Ergebnis? Werden extrahiert oder ersetzt? Wird dies in C#/VB.NET Code verwendet? Wenn ja, bitte aktualisieren Sie Ihre Frage mit diesen Informationen. Fügen Sie Details hinzu, wie Sie die Regex verwenden .. –

Antwort

0

Verwendung lookarounds:

(?<!")the(?!") 
+0

Dies entspricht auch 'the' in' leather' – Toto

+0

@Toto So funktioniert das OP-Muster. Wenn das nicht erwünscht ist, verwenden Sie Grenzen: '(?

0

HINWEIS: Diese Antwort auf die Vermutung beruht, dass die Anführungszeichen in der Eingabezeichenfolge ausgeglichen sind, und es gibt keine entkam Anführungszeichen. Für eine komplexere Grammatik sollte ein Parser geschrieben werden.

können Sie passen zitierte Teil nicht überlappende, die keine doppelte Anführungszeichen innen haben, und sie überspringen, während alle anderen the Handling (außerhalb von doppelten Anführungszeichen Strings) von sie mit einer (...)Capture-Gruppe erfassen.

using System; 
using System.Linq; 
using System.Text.RegularExpressions; 
using System.IO; 
public class Test 
{ 
    public static void Main() 
    { 
     var s = "As, we know that ThE development of \"the\" nation depends on people as well as The government of tHe country."; 
     var res = Regex.Replace(s, @"""[^""]*""|(the)", 
      m => m.Groups[1].Success ? m.Groups[1].Value.ToUpper() : m.Groups[0].Value, 
      RegexOptions.IgnoreCase); // Set case insensitive mode 
     Console.WriteLine(res); 
    } 
} 

Siehe IDEONE demo

Das "[^"]*"|(the) Muster entweder stimmt mit einem einfachen zitierte String mit "[^"]*" oder Streichhölzer und fängt eine the in Gruppe 1.

Die m => m.Groups[1].Success ? m.Groups[1].Value.ToUpper() : m.Groups[0].Value überprüft, ob der Gruppe 1 abgestimmt: Wenn es abgestimmt , wir haben einen zitierten Teilstring, er wird wieder in den resultierenden String eingefügt, ansonsten wird the in Großbuchstaben umgewandelt.

Verwandte Themen