2013-05-22 6 views
5

केवल उन लाइन ब्रेक का चयन करना संभव है जो नियमित अभिव्यक्तियों का उपयोग करके अवधि से पहले नहीं हैं? मैं छात्रों के लिए उपशीर्षक फ़ाइलों को संपादित कर रहा हूं। मुद्रित संस्करण को मृत पेड़ के अनुकूल बनाने के लिए मैं एक पंक्ति के साथ अवधि या प्रश्न चिह्न से पहले की सभी लाइन ब्रेक को प्रतिस्थापित करने की कोशिश कर रहा हूं।एक नियमित अभिव्यक्ति के साथ अवधि से पहले सभी लाइन ब्रेक को प्रतिस्थापित नहीं करता है?

विकल्प 1
सभी लाइन का चयन अवधि या प्रश्न चिह्न regex [a-z]\n कि लिए काम करता है से पहले नहीं टूटता है, लेकिन फिर यह निश्चित रूप से लाइन ब्रेक से पहले शब्द के अंतिम अक्षर का चयन करता है। -> यह संभव किसी भी तरह बचाने के लिए और लाइन ब्रेक से पहले शब्द के अंतिम अक्षर डालें और नियमित अभिव्यक्ति का उपयोग करते हुए एक साथ सम्मिलित है कि एक स्थान के साथ या मुझे लगता है कि के लिए एक स्क्रिप्ट (कहना php)

लिखने के लिए है है विकल्प 2
किसी चरित्र द्वारा पहले से केवल लाइन ब्रेक चुनें। मैंने देखने की कोशिश की।

इस प्रश्न को लिखते समय समाधान ने मुझे मारा। किसी चरित्र द्वारा पहले से एक लाइन ब्रेक का चयन करने के लिए (?<=[a-z])\n करें और फिर किसी स्थान के साथ प्रतिस्थापित करें।

मैंने स्टैक ओवरफ़्लो की खोज की और वास्तव में वह नहीं ढूंढ सका जो मैं ढूंढ रहा था। मुझे आशा है कि मैं एक ही समय में प्रश्न और समाधान पोस्ट करके किसी को भी दंडित नहीं करूंगा। यह भविष्य में किसी और की मदद कर सकता है।

+7

आप आप अपने खुद के सवाल, पोस्ट का जवाब है और यह स्वीकार करते हैं अपना स्वयं का प्रश्न – Blender

+2

जवाब कर सकते हैं। यह एक मानक चीज है जिसे आप SO पर करने की उम्मीद कर रहे हैं। – Patashu

+0

मैं @ ब्लेंडर से सहमत हूं। आपको सही टुकड़े मिल गए हैं। बस याद रखें कि '' .'' का अर्थ है "कोई भी चरित्र", जबकि '' \ .'' का अर्थ है "अवधि" और '\ R''' '\ n'' से कुछ हद तक सुरक्षित है। – mzedeler

उत्तर

0

टेक्स्ट (जावा, पर्ल, PHP, sed, vi, आदि) को प्रतिस्थापित करने के लिए आप जो भी उपयोग कर रहे हैं उसके आधार पर सिंटैक्स भिन्न हो सकता है।

जावा में आप इस कोशिश कर सकते:

str.replaceAll("([^\\.!?])\r?\n", "$1 ").replaceAll(" +", " "); 

पर्ल में:

perl -p -e 's/([^\.!?])\n/\1 /g; s/ +/ /g;' file.txt 

तुम भी एक ऐसी ही सवाल करने के लिए इस सवाल का जवाब पढ़ सकते हैं:

How can I replace a newline (\n) using sed?

+0

क्या आप इसका उपयोग php का उपयोग कर सकते हैं? – user1017063

+0

@wim hendrix यह विकल्प 1. @Eric Citaire आपको एक चरित्र वर्ग के अंदर ''' से बचने की आवश्यकता नहीं है। साथ ही, मेरा मानना ​​है कि पर्ल में आधिकारिक सिफारिश प्रतिस्थापन स्ट्रिंग में '$ 1' और '\ 1' का उपयोग नहीं किया गया था। Http://perldoc.perl.org/perlre.html#Quoting-metacharacters पर एक उदाहरण है, लेकिन मैंने कुछ भी नहीं ढूंढ पाया है जो कहता है कि आपको '\ 1' का उपयोग नहीं करना चाहिए। (रेगेक्स में ही, मैं अभी भी '\ 1' का उपयोग करता हूं।) –

0

के परिभाषित करते हैं एक लाइन ब्रेक पहले। कुछ रेगेक्स स्वादों में, जावा 8/पीएचपी (पीसीआरई), रुबी (ओनिगो), आप \R शॉर्टेंड कैरेक्टर क्लास का उपयोग कर सकते हैं जो किसी भी लाइन ब्रेक शैली से मेल खाता है। में Java 8 regex reference, \R is defined के रूप में:

\u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029] 

अब, आप अगर यह . चार के साथ पहले नहीं कर रहा है इस पैटर्न खोजना चाहते हैं। आपको नकारात्मक दिखने की आवश्यकता है, (?<!\.)। एक बार यह वर्तमान स्थान के बाईं ओर . पाता है तो यह मैच विफल हो जाता है।

  • पीएचपी (demo): preg_replace('~(\.\R+)|\R+~', '$1', $s)
  • जावा 7 (demo): तो, यहाँ कैसे कुछ भाषाओं में एक बिंदु के साथ पहले नहीं लाइन ब्रेक दूर करने के लिए के कुछ उदाहरण हैं String rx_R = "(?:\\u000D\\u000A|[\\u000A\\u000B\\u000C\\u000D\\u0085\\u2028\\u2029])"; String res = s.replaceAll("(\\." + rx_R + ")|" + rx_R, "$1");
  • रूबी (demo): s.gsub(/(\.\R+)|\R+/, '\1')
  • सी # (demo देखें): var rx_R = @"(?:\u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029])"; var res = Regex.Replace(txt, [email protected]"(\.{rx_R})|{rx_R}", "$1");
  • अजगर (दोनों 2.x और 3.x) (demo): rx_R = r'(?:\u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029])' और फिर re.sub(r'(\.{0})|{0}'.format(rx_R), lambda x: x.group(1) if x.group(1) else '', s)
  • जावास्क्रिप्ट: यह एक lookbehind लिए कोई समर्थन नहीं है, इस प्रकार, एक ([^.]|^) कब्जा समूह और एक backreference ($1 प्रतिस्थापन स्ट्रिंग से यह संदर्भ के लिए) एक लाइन ब्रेक से पहले . के अलावा अन्य चार रखने के लिए उपयोग करें:

var s = "Line1\u000D\u000A Line2\u000B Line3\u000C Line4\u0085 Line5\u2028 Line6\u2029 Line7"; 
 
var rx = /([^.]|^)(?:\u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029])/g; 
 
console.log(s.replace(rx, '$1'));

+0

कहें कि मैं एक ऐसे पाठ का परीक्षण करता हूं जिसका ईओएल \ r \ n है। PHP में, मैं 'preg_replace ('~ (?

+0

@ScottChu यह बैकट्रैकिंग और तथ्य यह है कि '\ R' एक निश्चित चौड़ाई पैटर्न नहीं है (आप इसे" अनियंत्रित "' \ R' वर्ण वर्ग पैटर्न को देखकर देख सकते हैं, यह 1 या 2 से मेल खा सकता है वर्ण)। एक बार '\ r' मिलने के बाद, इसके बाईं ओर तुरंत ''' खोजा जाता है। चूंकि ''' है,' \ r' असफल रहा है और इंजन '\ n' का परीक्षण करने के लिए चला जाता है - और चूंकि यह' \ r' ('''' 'से पहले नहीं है, यह' \ n' मिलान किया गया है और एक जगह के साथ प्रतिस्थापित किया गया है। आपको 'preg_replace (' ~ (\। \ R +) | \ R + ~ ',' $ 1 ', $ s) का उपयोग करना चाहिए, PHP में, [** यह डेमो **] देखें (https://ideone.com/e7Ms5x)। –

+0

@ScottChu आपको बताने के लिए धन्यवाद, मैं जवाब में सुधार कर सकता हूं। –

संबंधित मुद्दे