Hej, jag misstänker att negeringen med ! inte fungerar. Anledningen till denna udda fråga är att indexserverns reserverade ord, vilket inte är så många behöver just " runt sig för att tolkas korrekt när sql-satsen körs. Det är alltså ett 15-tal kombinationer man kan använda sig av och försökte mig på denna variant. Det finns ingen !-kod i regular expression. Det blir en felaktig väg. Kanske jag skall försöka förklara det med ett exempel istället för det brukar vara enklare. Microsoft Indexserver kan ta emot sql-satser för att söka något. Ex: Så som du skrivit nu, så är det ju bara en replace av AND med "AND" o.s.v Jag misstänker att du vill ha det tvärt om. Okej... Det är ju precis tvärtom mot exemplet du visade förut. Koden fungerar alldeles perfekt för det du sa att du ville ha den till... Å jag är förvirrad i skallen, ber om ursäkt. Det skall ju inte vara så. Vet inte om det går att göra på ett smidigare sätt, men här är en funktion (i C#) som gör detta:asp.net - försöker ersätta sträng
Jag har en ursprungssträng för sökning - exempelvis "pelle AND soft". Jag vill sätta " , dvs chr(34) runt alla ord som INTE är i listan nedan, vad gör jag för fel?
<code>
Dim r As Regex
Dim m As Match
Dim y as String
Dim searchphrase As String = "pelle AND soft"
y = r2.Replace(searchphrase, "!(and not|and|or not|or)", Chr(34) & "$1" & Chr(34), RegexOptions.IgnoreCase Or RegexOptions.Compiled)
</code>
Jag vill att resultatet skall bli en sträng med alla ord inneslutna av " " som inte finns i listan ovan.
"pelle" AND "soft"
Tack på förhandSv: asp.net - försöker ersätta sträng
Kan man helt enkelt inte tänka sej så att du istället för att matcha allt utom and not, and, or not, or och sätter "fnuttar" runt det istället sätter matchar explicit and not, and, or not, or och ersätter dom med fnutt $1 fnutt, och om match hittades sätter till fnuttar i början och slutet av strängen?
beteendet vid t.ex. ord1 ord2 and not ord3 kommer att ändra, men vad är meningen: "ord1" "ord2" and not "ord3" eller "ord1 ord2" and not "ord3" ?
/SimonSv: asp.net - försöker ersätta sträng
Sv: asp.net - försöker ersätta sträng
Jag har inte hittat något sätt att matcha alla ord utom vissa, men du kan ju sätta citattecken runt alla ord, och sedan ta bort dem på de ord som inte ska ha dem:
y = r2.Replace(searchphrase, "(\S+)", """$1""", RegexOptions.IgnoreCase Or RegexOptions.Compiled)
y = y.Replace(searchphrase, """(and|or|not)""", "$1", RegexOptions.IgnoreCase Or RegexOptions.Compiled)Sv: asp.net - försöker ersätta sträng
ftp and windows near vb and not delphi
Denna fråga skall nu köras in i en sql-sats för att köras mot indexservern. För att kunna skicka in frågan måste " markeras runt de ord som är nyckelord, dvs reserverade av indexservern för annars blir det fel. Så resultatet skall bli, då AND, NEAR AND NOT är reserverade ord
ftp "and" windows "near" vb "and not" delphi
Hoppas detta förtydligar vad jag vill uppnå via regexp. Dom reserverade orden får jag manuellt lägga till i en lista.Sv: asp.net - försöker ersätta sträng
/mSv: asp.net - försöker ersätta sträng
y = r2.Replace(searchphrase, "(and not|near|and)", """$1""", RegexOptions.IgnoreCase Or RegexOptions.Compiled)Sv: asp.net - försöker ersätta sträng
Alla reserverade ord skall vara fria och gå på grönbete. Däremot skall de andra orden inneslutas så länge de inte finns med i listan. Alltså inte varje ord utan alla ord, tills ett reserverat ord kommer. Vi tar en längre fras.
exempel på ftp and not vb - > "exempel på ftp" and not "vb"
använda ado med refresh near asp -> "använda ado med refresh" near "asp"
1 2 3 4 and 5 not near 6 7 8 and 9 -> "1 2 3 4" and "5" not near "6 7 8" and "9"
Så skall det förstås vara. Ingen enkel uppgift men går säkert att lösa. Dom reserverade orden är såna man kan lägga till vartefter. Sv: asp.net - försöker ersätta sträng
<code>
string QuoteWords(string query)
{
string word;
System.Text.StringBuilder result = new System.Text.StringBuilder();
int pos, next;
bool keyword;
keyword = true;
pos = 0;
while (pos < query.Length - 1)
{
next = query.IndexOf(' ', pos);
if (next == -1) next = query.Length;
word = query.Substring(pos, next - pos);
if (word=="and" || word=="not") {
if (!keyword) result.Append('"');
result.Append(' ');
result.Append(word);
keyword = true;
} else {
if (result.Length > 0) result.Append(' ');
if (keyword) result.Append('"');
result.Append(word);
keyword = false;
}
pos = next + 1;
}
if (!keyword) result.Append('"');
return result.ToString();
}
</code>
Jag har inte testat så väldigt många olika kombinationer, men den fungerar i alla fall oavsett om första och sista ordet är reserverat eller inte.
Kontrollen mot reserverade ord kan säkert göras lite flexiblare, men det funkar i alla fall. En start...