DufferMedlem sedan mars 2003429 inlägg Hej,
Jag försöker matcha strängar där man kan skriva värden med eller utan fnuttar ( " ) och där man skiljer på orden med space . Man kan välja att skriva med eller utan citattecken, men vill man att flera ord ska räknas som ett måste man skriva det inom citattecken, t.ex. kan man skriva:
first second -last
"first word" second -last
first "second word" -last
"first word" "second word" -last
ja ni förstår poängen, min regexp som funkar ser ut såhär:
("[^"]+"|[^\s]+)\s+("[^"]+"|[^\s]+)\s+-(.+)
Men den tar med "fnuttarna" i resultatet, kan jag på något sätt slippa dem?
Tack för hjälpen!
Mvh
Tobias
EDIT! Stavning
(\"?[^\"]+"?|[^\s]+)\s+(\"?[^\"]+"?|[^\s]+)\s+-(.+)
??
" skall skrivas \" enligt min mening :)
Du får nog ta en replace på alla " för att plocka bort den. regExp letar ju efter mönster.
\"?(\-?[^\" ]+)\"?
får jag flera träffar om jag skriver: first word second word -last
och spara alla "träffar" i en grupp.. dvs den sparar:
first
word
second
word
-last
(dock om man vill använda -last med " måste man skriva: "-last") går väl och fixa.
DufferMedlem sedan mars 2003429 inlägg Tack för hjälpen voightann1 men det sista kan jag tyvärr inte använda eftersom jag måste hantera det som står inom "" som ett ord, och det är så jag vill ha det. angående escape på "fnuttarna" så funkar det feint utan dem, iaf i JS ;-)
Mvh
"([^\"]+)"|([^ ]+)
Testade snabbt i RegExBuddy:
first "word second word" "asda asd"
gav träff (när jag gjorde en replace):
- first
- word second word
- asda asd
subject = subject.replace(/"([^"]+)"|([^ ]+)/ig, "$1$2");
DufferMedlem sedan mars 2003429 inlägg Det är inte vad jag är ute efter ;-) , då blir livet enklare för mig med min regexp och sen bara köra replace på citattecknena, eftersom att sista ordet med bindestrecket framför är obligatoriskt, så finns inte det sista argumentet i arrayn så har man anget en felaktig sträng.
Mvh
-last skall alltid vara med i din sträng då? Hur många ord kan det vara innan?
Tror du måste göra det i två led:
hitta alla ord mellan " " och ersätta de mellanslagen med något tecken (__ ?) och sen plocka bort "" och sen behandla den nya strängen att du splitar mellanslagen. Är trött nu :/ men kommer inte på någon direkt bra lösning.
Peter SMedlem sedan dec. 20025 483 inlägg var matches = myString.match(/"[^"]+"|[^ ]+/g);
DufferMedlem sedan mars 2003429 inlägg Poängen är den att användaren är och ska vara tvingad att skriva två strängvärden antingen inanför " " eller som ett enda ord utan, skilda med space, sen SKA man ha anget en sista "flagga" som inleds med - (bindestreck) men detta bindestreck vill jag bara se att det finns där men sen matcha strängvärdet, så som min regexp gör.
Frågan här var ju "Hur slipper jag fnuttarna" men jag har förstått att det är klurigt =/
Mvh
Tobias
"?([^"]+|[^\s]+)"?\s+"?([^"]+|[^\s]+)"?\s+-(.+)
gäller väl då?
Peter SMedlem sedan dec. 20025 483 inlägg if (/^(?:"([^"]+)"|([^ ]+)) (?:"([^"]+)"|([^ ]+)) -\w+$/.test(q)){
alert( "First: " + (RegExp.$1 || RegExp.$2) +
", second: " + (RegExp.$3 ||RegExp.$4) )
} else {
alert("Input error");
}