الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

برنامج بحث واستبدال

مغلق
بدأه جافاك في 13 مايو 2005 · 11 رد · 989 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

هذه أول مشاركة لي ، وأحب هنا أن أشكركم على هذا المنتدى الرائع.

أعمل الآن على برنامج يقوم بالبحث في الملفات النصية ويستبدل كلمة البحث بكلمة أخرى موجودة في ملف آخر

ما علملته حتى الآن ، قمت بقراءة الملفين النصيين ومن ثم تحويل الأسطر في كل ملف إلى مصفوفة ...

استخدم الوظيفة repalceAll(String, String) للقيام بعملية البحث والاستبدال ، لكن المشكلة في الآتي ...

عندما يقوم البرنامج بالحث عن كلمة int مثلاً ، فهو يقوم باستبدال كل الكلمات أو مقاطع الكلمات ، أي أنه عندما يقرأ الكلمة print مثلاً فهو يقوم باستبدال الأحرف الثلاثة الأخيرة من الكلمة أيضاً

كيف أجعل الأمر يقرأ فقط الكلمات المنفصلة دون القيام بقراءة واستبدال الأحرف داخل الكلمات ؟؟؟

#2

استبدل كل " int " وليس كل "int"

أضف مسافة قبل وبعد الكلمة!

#3

أشكرك على تعاونك

أحياناً الكلمة يسبقها علامات مثل الأقواس () أو نقطة في النهاية .

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

أرجو منك الإفادة أستاذ أبو مازن ومن كل من لديه الحل

#4

جرب http://java.sun.com/j2se/1.4.2/docs/api/ja...ex/Pattern.html

http://java.sun.com/j2se/1.4.2/docs/api/ja...ex/Matcher.html

تم تعديل هذه المشاركة بواسطة أبومازن في 13 مايو 2005 في 19:13

#5

اعتقد افضل حل في هذه الحالة ان تكتب method خاص بك يقوم بهذه العملية, بدل من استخدام replaceAll, و في هذه الحالة, عندما تجد "int", تستطيع فصح الحرفين السابق و اللاحق, فإذا كان أحدهما حرفا انجليزيا, فمعنى هذا ان لا يجب ان تستبدل هذه الـ "int", اما اذا كان غير ذلك, فتستطيع استبدالها.

مثلا, لنفرض انك وجدت "int" في index

String text .. //the whole text we are searching
String pattern ..... //the pattern we're looking for, coule be the "int" thing
int index .... //the index of the current occurance of the pattern
....

//now assume we found an occurance of the pattern at 'index'
char before = text[index - 1];
char after = text[index + pattern.length() + 1];

if( isEnglishLetter(before) || isEnglishLetter(after) )
{
    //don't replace, because this is part of a bigger word
}
else
{
    //replace, this is an isolated occurance of the pattern
}

طبعا الكود غير كامل ولا شي, هو مجرد مثال للفكرة.

و كذلك لست متأكدا من الطريقة اللتي استخدم فيها الـ index يعني, ربما يكون هناك خطأ بمقدار حرف واحد او شي من هذا القبيل off by one error ..

يعني

char after = text[index + pattern.length() + 1];

يفترض ان يكون الحرف اللذي يلي الكلمة مباشرة, و لكن لست متأكدا ان كان هذا هو الـ Index الصحيح للحرف, عادة اقوم بتجريب الكود للتأكد من هذه الأمور, خصوصا عند التعامل مع الـ string

#6

شكرا لكم

سأجرب الطرق المذكورة ، وأرد لكم الخبر

تحياتي لكم

#7

تسجيل حضور

وبالتوفيق للجميع

11_03_06_12_48_57_1142110137Image(_66).jpg

#8

قمت بتجربة طريقة أخرى ناجحة

استخدمت StringTokenizer وجعلت المدخلات المسافة و t\ n\ \ / . , ; ، بهذا ضمنت أن الكلمات ستقسم فقط ، بعدها أدخلت الناتج داخل مصفوفة وأجريت عملية حلقة قمت استعملت فيها الميثود replaceAll بشرط أن arry.equals(String) ... ونجحت الطريقة

ما رأيكم :) ؟؟

#9

أعتقد أنها بطئية بعض الشيء، ولهذا اقترحت عليك السابق.

ادرس تلك الفئات جيدا.

#10

السلام عليكم

جرب أن تعمل على الكلاس StreamTokenizer مباشرة

StreamTokenizer

#11

بعد أن جربت الطريقتين، اتضح لي أنهما بنفس السرعة. خذ هذه الطريقة: لاحظ استخدامي للفئة Matcher و Pattern من حزمة java.util.regex

 	 StringBuffer b=new StringBuffer();
 	 String oldWord="chair";
 	 String newWord="table";
  Pattern p=Pattern.compile("[^a-zA-Z]"+oldWord+"[^a-zA-Z]");
  String h="chair chair (chair) achaira chairchair schair chairt chair -chair-. chair";
  System.out.println(h);
  //if oldWord the first word
  if(h.indexOf(oldWord)==0)h=newWord+h.substring(oldWord.length());
  //if oldWord the last word
  if(h.lastIndexOf(oldWord)==h.length()-oldWord.length())h=h.substring(0, h.length()-oldWord.length())+newWord;
  System.out.println(h);
  Matcher m=p.matcher(h);
 	 long time1=System.currentTimeMillis();
  while(m.find()){
 	 String group=m.group();
 	 m.appendReplacement(b,group.substring(0,1)+newWord+group.substring(group.length()-1));
  }
  m.appendTail(b);
  System.out.println(b);
  System.out.println("Time to precoess: "+(System.currentTimeMillis()-time1));

بالتوفيق....

#12

شكرا لكم على هذه المعلومات

هذا الموضوع مغلق.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…