سؤال

أحاول حاليا تصفية ملف نصي يحتوي على كلمات مفصولة ب "-". أريد حساب الكلمات.

scanner.useDelimiter(("[.,:;()?!\" \t\n\r]+"));

المشكلة التي تحدث ببساطة هي: الكلمات التي تحتوي على "-" سيتم فصلها وحسابها لكونها كلمتين. لذلك فقط الهروب مع - ليس حل الاختيار.

كيف يمكنني تغيير التعبير المحدد، بحيث ستظل الكلمات مثل "Foo-bar"، ولكن سيتم تصفية "-" وحدها وتجاهلها؟

شكرا ؛)

هل كانت مفيدة؟

المحلول

حسنا، أنا أظن على سؤالك هنا: تقصد أن يكون لديك ملف نصي مع بعض النثر "الحقيقي"، أي جمل أي معنى فعليا، مفصولة عن علامات الترقيم وما شابه ذلك، إلخ؟

مثال:

يتم تحسين هذا الوضع - بقدر ما يمكننا أن نقول - من خلال حقيقة أن حلفائنا الأكثر ثقةين، والمجاهدين، يواصلون عقد مسابقاتهم الصلاحية شعرهم؛ لدى العدو حافز ضئيل للتدخل في ذلك، حتى مع أجهزة كتم الصوتية.

لذلك، ما تحتاجه كمحدد هو شيء إما أي كمية من المسافة البيضاء و / أو علامات الترقيم (التي قمت بتغطيتها بالفعل مع Regex الذي أظهرته)، أو الواصلة المحاطة بمسافة بيضاء واحدة على الأقل على كل جانب. حرف Regex ل "أو" هو "|". هناك اختصار لفئة حرف Whitespace (المسافات، علامات التبويب، والخطوط الجيوغي) في العديد من تطبيقات Regex: " S".

"[.,:;()?!\"\s]+|\s+-\s+"

نصائح أخرى

إذا كان ذلك ممكنا حاول استخدام الفئات المحددة مسبقا ... يجعل Regex أسهل بكثير القراءة. انظر java.util.regex.pattern للخيارات.

ربما هذا هو ما تبحث عنه:

string.split("\\s+(\\W*\\s)?"

يقرأ: تطابق 1 أو أكثر من الأحرف المسافة بيضاء سحر اختياريا من الأحرف الصفرية أو أكثر من الأحرف غير النصية وحرف بيضاء.

هذا ليس بسيطا جدا. شيء واحد يجب تجربته سيكون {{{{{{} {}

قد يكون من الأسهل فقط تجاهل الكلمات التي تم إرجاعها بواسطة الماسح الضوئي يتكون بالكامل من الواصلات

Scanner scanner = new Scanner("one   two2  -   (three) four-five - ,....|");
scanner.useDelimiter("(\\B+-\\B+|[.,:;()?!\" \t|])+");

while (scanner.hasNext()) {
    System.out.println(scanner.next("\\w+(-\\w+)*"));
}

ملح

تؤكد الطريقة التالية (السلسلة) أنك تحصل على كلمات فقط لأن الطريقة الإستهبات الأصلية () تفقد "|"

ملح

لقد استخدمت التعبير العادي " r n | n" as terminator. يعرض Javadocs for java.util.regex.pattern آخر المنهي المحتملين، لذلك سيستخدم فحص أكثر اكتمالا التعبير " r n | [ r n u2028 u2029 u0085

يجب أن يكون هذا بسيطا بما فيه الكفاية: [^\\w-]\\W*|-\\W+

  • ولكن بالطبع إذا كان النثر، وتريد استبعاد اشرع:
    [^\\p{Alnum}-]\\P{Alnum}*|-\\P{Alnum}+
  • أو إذا كنت لا تتوقع الأرقام:
    [^\\p{Alpha}-]\\P{Alpha}*|-\\P{Alpha}+

تعديل: هذه أشكال أسهل. ضع في اعتبارك الحل الكامل، من شأنه أن يتعامل مع شرطات في بداية ونهاية الخطوط سيتبع هذا النمط. (?:^|[^\\w-])\\W*|-(?:\\W+|$)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top