Nu är detta inte ett ASP specifikt problem men det får hamna här ändå. Här är ett exempel på hur man kan skriva: Det där hjälper mig inte speciellt mycket heller tyvärr. Hej igen. Nu börjar det likna nåt, den matchar nu men $1 matchar nu bara första tecknet innom kommentaren o det var inte riktigt vad jag hade tänkt mig om du tittar på det översta exemplet t.ex.RegExp trubbel
Jag vill fånga upp "C kommentarer":
/* kommentar */
/* (<-observera att jag har blanksteg här)
* kommentar som inte matchas, mitt problem alltså
*/
Funktionen om nån vill testa:
<code>
Function ReplaceTest(str, patrn, replStr)
Dim regEx ' Create variables.
Set regEx = New RegExp ' Create regular expression.
regEx.Pattern = patrn ' Set pattern.
regEx.IgnoreCase = True ' Make case insensitive.
regEx.Global = True ' Set global applicability.
regEx.MultiLine = True
ReplaceTest = regEx.Replace(str, replStr) ' Make replacement.
End Function
'Mitt anrop
strContent=ReplaceTest(strContent, "/\* (.*) \*/", "<span class=""comment"">/* $1 */</span>") ' Make replacement.
</code>
Mönstret borde väl vara "/\* ([.\n]*) \*/" men då fångar den inget, som det är nu tar den med kommentarer på samma rad iaf.
Nån som har någon aning om vad som är fel?Sv: RegExp trubbel
<code>
static private void StripComments (string name) {
StreamReader sr;
string all;
Regex rg = new Regex(@"/\*.*?\*/", RegexOptions.Singleline);
try {
sr = new System.IO.StreamReader (name);
all = sr.ReadToEnd ();
System.Console.WriteLine (rg.Replace (all, ""));
}
catch (Exception ex) {
System.Console.Error.WriteLine (ex.Message);
}
}
</code>
Koden klarar inte kommentarer i kommentarer, dvs nästlade kommentarer.
Jag använder RegexOptions.Singleline för att ändra betydelsen av "." Istället för att
matcha alla tecken utom \n matchar den nu alla tecken. Jag skulle också kunna
skriva
<code>
Regex rg = new Regex (@"/\*(.|\n)*?\*/", RegexOptions.Multiline);
</code>
för att tala om att strängen jag matchar innehåller flera rader. Jag måste dock matcha
newline explicit. Multiline ändrar betydelsen av ^ och $ så de matchar början och slutet
av rader snarare än strängen som helhet.
Notera att i en [] konstruktion betyder . bara . och inte vilket-tecken-som-helst.
Mvh
FredrikSv: RegExp trubbel
Det är VBS jag skriver det i så jag kan inte göra på ditt sätt (hittar ingen singeline egenskap).
I Java har jag däremot fått det att funka med multi o singleline flaggorna.
Det där med [.] förstår jag inte riktigt eftersom referensmanualen säger:
"Matches any single character except "\n". To match any character including the '\n', use a pattern such as '[.\n]'."
Men jag tvivlar inte på det du säger eftersom det inte funkar alls när jag gör så.Sv: RegExp trubbel
Jag provade följande kod i VBScript.
<code>
Dim fs, stream, text, regEx
Set fs = CreateObject("Scripting.FileSystemObject")
Set stream = fs.OpenTextFile ("urk", 1)
text = stream.ReadAll
Set regEx = New RegExp
regEx.Pattern = "/\*(.|\n)*?\*/"
regEx.Global = True
Str = regEx.Replace(text, "")
WScript.Echo Str
</code>
Filen urk innehåller följande
<code>
hej
/* Dont show this */
du
/* and not
this */
glade
</code>
Om jag kör ovanstående skript så visar den all text utanför kommentarerna
Notera att jag läser in hela filen i en sträng och inte rad för rad.
Anledningen till frågetecknet förresten efter (.|\n)*? är för att göra en sk
non-greedy match så den inte slukar allt fram till sista */. Vi vill bara matcha
fram till första matchningen s a s.
Mvh
FredrikSv: RegExp trubbel
Dock löste jag det lilla problemet själv nu, tack så mycket för din hjälp.
Jag hade tidigare testat "/\* ((.|\n)*) \*/" men det fungerade inte heller, dock var ju frågetecknet lösningen på det problemet.