2016-10-30 7 views
1
public class MainTest { 
    public static void main(String ... args) { 
     Pattern p = Pattern.compile(args[0]); 
     Matcher m = p.matcher(args[1]); 
     while (m.find()) 
      System.out.print(m.start()+" "); 
     System.out.println(); 
    } 
} 

Der obige Code, wenn sie mit den Befehlen laufenRegex mit unterschiedlichen Charakterklassen in Java

java MainTest "\b" "^23 *$76 bc" 
java MainTest "\B" "^23 *$76 bc" 
java MainTest "\S" "^23 *$76 bc" 
java MainTest "\W" "^23 *$76 bc" 

ergibt

1 3 5 6 7 9 
0 2 4 8 
0 1 2 4 5 7 8 
0 3 4 6 

obwohl ich fast sicher gemacht haben, wäre es

1 3 6 8 9 11 
0 2 4 5 7 10 
0 1 2 4 5 6 7 9 10 
0 3 4 5 8 

OK, also \w bedeuten s [0-9A-Za-z_] und \b sollten mit allen \w und \W Grenze übereinstimmen, und \W sollte Leerzeichen und Sachen nicht in alnum+ Unterstrich entsprechen. Warum bekomme ich dann diese Ergebnisse? Ich kam hierher, um von einigen meiner ernsten Missverständnisse über Regex in Java befreit zu werden.

+0

@Aaron funktioniert: Das ist genau das, was ich sage. $, b, c sind alle auch nicht-Leerzeichen. Haben Sie versucht, meinen Code auf Ihrem Computer auszuführen? – Ilonpilaaja

+1

Ooh yeah nvm, ich habe mir das falsche Ergebnis angesehen -_- – Aaron

+1

Sieht aus wie Ihre erwartete Ausgabe für mich, wenn Sie keine Befehlszeilenargumente verwenden: http://ideone.com/IbCykI – Marvin

Antwort

1

@Andreas ist korrekt. Das Problem ist in der Linux-Shell: $ 7 wird durch nichts ersetzt, und das Befehlszeilenargument wird "^ 23 * 6 bc".

+1

Wenn Sie mit '' 'anstelle von' "' quittieren, sollte es funktionieren. Siehe http://www.grymoire.com/Unix/Quote.html#uh-1 – Andreas

+0

@Andreas: Fühlen Sie sich frei, dies zu beantworten. Ich werde deine Antwort akzeptieren. – Ilonpilaaja

+1

Der Zweck von StackOverflow besteht darin, ein Kompendium von Antworten auf allgemeine (oder nicht so häufige) Fragen zu erstellen. Allerdings ging es bei Ihrer Frage darum, dass Regex nicht funktioniert, und in der Lösung geht es darum, die korrekte Quotierung zu verwenden, um eine Substitution der Linux-Shell zu verhindern. Es ist unwahrscheinlich, dass jemand diese Frage/Antwort für ähnliche Shell-Substitutionsprobleme findet, daher wird die Beantwortung im Allgemeinen nicht nützlich sein. Ich würde vorschlagen, die Frage einfach zu löschen. – Andreas

0

Ich habe das gleiche Programm auf Linux sowie Windows ausgeführt. Ich fand, Linux Shell ersetzt Doppel zitiert Argumente nach Symbol $ mit ihren Werten (in Ihrem Fall, null, wie von Andreas erklärt). Hier ist Beispielcode, die

System.out.println("0:"+args[0]); 
    System.out.println("1:"+args[1]); 
    Pattern p = Pattern.compile(args[0]); 
    Matcher m = p.matcher(args[1]); 
    while (m.find()) 
     System.out.print(m.start()+" "); 
    System.out.println(); 

und führen mit Apostroph Argument auf beiden OS

java MainTest '\b' '^23 *$76 bc' 
java MainTest '\B' '^23 *$76 bc' 
java MainTest '\S' '^23 *$76 bc' 
java MainTest '\W' '^23 *$76 bc' 
+0

Nur ein Nitpick: 'bash' hat keinen' null' Wert; Der Verweis auf die nicht gebundene Variable '$ 7' wird als leere Zeichenfolge aufgelöst, wenn auf sie verwiesen wird (es sei denn, das 'nounset'-Flag der Shell wurde gesetzt, in welchem ​​Fall ein Fehler ausgelöst wird). – Aaron