سؤال

كيف تقوم بتعيين المحدد على الماسح الضوئي على أي منهما ؛ أم خط جديد؟

حاولت: Scanner.useDelimiter(Pattern.compile("(\n)|;"));لكنه لا يعمل.

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

المحلول

كقاعدة عامة ، في الأنماط ، تحتاج إلى مضاعفة \.

لذا حاول

Scanner.useDelimiter(Pattern.compile("(\\n)|;"));`

أو

Scanner.useDelimiter(Pattern.compile("[\\n;]"));`

يحرر: إذا \r\n هي المشكلة ، قد ترغب في تجربة هذا:

Scanner.useDelimiter(Pattern.compile("[\\r\\n;]+"));

الذي يطابق واحد أو أكثر من \r, \n, ، و ;.

ملحوظة: لم أحاول هذه.

نصائح أخرى

كما اكتشفت ، كنت بحاجة للبحث عن نمط الشبكة/الشبكة \r\n (CRLF) فواصل الخط بدلاً من نمط UNIX \n (LF فقط). ولكن ماذا لو كان النص يحتوي على كليهما؟ هذا يحدث كثيرا في الواقع ، عندما أرى مصدر هذه الصفحة بالذات ، أرى كلا الأصناف.

يجب أن تحصل على عادة البحث عن كلا النوعين من الفاصل ، وكذلك نمط MAC الأقدم \r (CR فقط). إليك طريقة واحدة للقيام بذلك:

\r?\n|\r

توصيل ذلك في نموذج رمزك تحصل عليه:

scanner.useDelimiter(";|\r?\n|\r");

هذا يفترض أنك تريد مطابقة سطر جديد أو فاصلي واحد بالضبط في وقت واحد. إذا كنت تريد مطابقة واحدة او اكثر يمكنك القيام بذلك بدلاً من ذلك:

scanner.useDelimiter("[;\r\n]+");

لاحظ ، أيضًا ، كيف مررت في regex سلسلة بدلا من نمط ؛ يتم تخزين جميع عمليات إعادة التخزين المؤقت تلقائيًا ، لذلك لا يحصل لك Regex مسبقًا على أي مكسب أداء.

بالنظر إلى تعليق البروتوكول الاختياري ، يبدو أنه كان خطًا مختلفًا ( r n أو crlf) الذي كان المشكلة.

إليكم إجابتي ، والتي ستتعامل مع انتقادات فنية متعددة ونهايات الخط في أي من التنسيقين (قد تكون أو لا تكون مرغوبة)

Scanner.useDelimiter(Pattern.compile("([\n;]|(\r\n))+"));

على سبيل المثال ، ملف إدخال يشبه هذا:

1


2;3;;4
5

سوف يؤدي إلى 1،2،3،4،5

لقد حاولت n و n - كلاهما عمل في حالتي ، على الرغم من أنني أوافق إذا كنت بحاجة إلى اندلاء عادي ، فأنت تريد مضاعفةها لأنها شخصية للهروب. يحدث فقط أنه في هذه الحالة ، يصبح " n" الشخصية المطلوبة مع أو بدون ""

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