سؤال الماسح الضوئي جافا
-
22-09-2019 - |
سؤال
كيف تقوم بتعيين المحدد على الماسح الضوئي على أي منهما ؛ أم خط جديد؟
حاولت: 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" الشخصية المطلوبة مع أو بدون ""