मैं निम्नलिखित की तरह एक वाक्य को उलटने की कोशिश कर रहा हूँ: इनपुट:

मेरा नाम जॉन है। मैं 23 साल का हूं।

उत्पादन:

.old वर्ष 23 पूर्वाह्न मैं .जॉन नाम my . है

मैं यह नहीं समझ सकता कि अंत में बिंदु को कैसे स्विच किया जाए। मैंने Split का उपयोग करने की कोशिश की लेकिन यह हमेशा शब्द के अंत में बिंदु लौटाता है।

 string[] words = sentence.Split(' ');
 Array.Reverse(words);
 return string.Join(" ", words);
1
anc22 15 जिंदा 2022, 21:05
आप पहले बिंदुओं पर विभाजित क्यों नहीं होते, और फिर वही करते हैं जो आप अभी करते हैं। और बाद में अंत में डॉट्स के साथ इसे वापस एक साथ रख दें।
 – 
nvoigt
15 जिंदा 2022, 21:08

4 जवाब

शब्द शुरू होने से पहले अवधि ('.') को स्थानांतरित करने के लिए अतिरिक्त तर्क जोड़ें, जैसे

var sentence ="my name is john. i am 23 years old.";  //Input string
string[] words = sentence.Split(' ');                //Split sentence into words
Array.Reverse(words);                                //Revere the array of words

//If word starts with . then start your word with period and trim end.
var result = words.Select(x => x.EndsWith('.') ? $".{x.Trim('.')}" : x);  
                            //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^This was missing
Console.WriteLine(string.Join(" ", result));

ऑनलाइन प्रयास करें

1
Prasad Telkikar 15 जिंदा 2022, 21:31
Array.Reverse: sentence..Split(' ').Reverse().Select(x =>...) की कोई आवश्यकता नहीं है और .Trim के बजाय .TrimEnd का उपयोग करें।
 – 
Metro Smurf
15 जिंदा 2022, 21:51

आप रिक्त स्थान से अलग किए गए शब्दों को उलट रहे हैं (old. में बिंदु शब्द का हिस्सा है)। यदि आप बिंदुओं को भी उलटना चाहते हैं तो आप उन्हें शब्दों के रूप में मानना ​​​​चाहते हैं (अंतरिक्ष द्वारा प्रसारित):

public static class TextExtensions
{
    public static string PointTrick(this string str) => str.Replace(".", " .");

    public static string PointUntrick(this string str) => str.Replace(". ", ".");

    public static string ReverseWords(this string str) => string.Join(" ", str.Split(" ").Reverse());
}

वे परीक्षण पास हो जाते हैं।

[TestClass]
public class SOTests
{
    private string GetReversedWithPointTrick(string input) => input.PointTrick().ReverseWords().PointUntrick();


    [TestMethod]
    public void ReverseWordsTest()
    {
        var sut = "three two. one";
        var expected = "one two. three";

        var result = sut.ReverseWords();

        Assert.AreEqual(expected, result);
    }

    [TestMethod]
    public void ReverseWords_PointTrick_Test()
    {
        var sut = "my name is john. i am 23 years old.";
        var expected = ".old years 23 am i .john is name my";

        var result = GetReversedWithPointTrick(sut);

        Assert.AreEqual(expected, result);
    }
}
0
Soleil 15 जिंदा 2022, 21:50

आप लिंक और रेगुलर एक्सप्रेशन के संयोजन को आज़मा सकते हैं:

  using System.Linq;
  using System.Text.RegularExpressions;

  ...

  string source = "my name is john. i am 23 years old.";

  // .old years 23 am i .john is name my
  string result = string.Join(" ", Regex
    .Matches(source, @"\S+")
    .Cast<Match>()
    .Select(m => Regex.Replace(m.Value, @"^(.*?)(\p{P}+)$", "$2$1"))
    .Reverse());

यहां हम दो पैटर्न का उपयोग करते हैं: एक साधारण "\S+" जो किसी भी वर्ण से मेल खाता है जो रिक्त स्थान नहीं हैं। अगला पैटर्न ^(.*?)(\p{P}+)$ समझाने लायक है:

^(.*?)(\p{P}+)$

यहां

^        - anchor, start of the string 
(.*?)    - group #1: any symbols, but as few as possible
(\p{P}+) - group #2: one or more punctuation symbols
$        - anchor, end of the string

और मिलान होने पर हम इन समूहों को स्वैप करते हैं: "&2&1"

डेमो:

private static string Solve(string source) => string.Join(" ", Regex
  .Matches(source, @"\S+")
  .Cast<Match>()
  .Select(m => Regex.Replace(m.Value, @"^(.*?)(\p{P}+)$", "$2$1"))
  .Reverse());

...

string[] tests = new string[] {
  "my name is john. i am 23 years old.",
  "It's me, here am I!",
  "Test...",
};

string report = string.Join(Environment.NewLine, tests
  .Select(test => $"{test,-35} => {Solve(test)}"));

Console.Write(report);

परिणाम:

my name is john. i am 23 years old. => .old years 23 am i .john is name my
It's me, here am I!                 => !I am here ,me It's
Test...                             => ...Test
0
Dmitry Bychenko 15 जिंदा 2022, 22:15
तेलकीकर: मुझे regular-expressions.info/tutorial.html से बहुत कुछ मिला है।
 – 
Dmitry Bychenko
15 जिंदा 2022, 21:46

क्योंकि किसी को हमेशा इन चीजों का LINQ संस्करण पोस्ट करना होता है

sentence.Split().Reverse.Select(w => w[^1] == '.' ? ('.' + w[..^1]) : w);

बिना किसी तर्क के स्प्लिट व्हॉट्सएप पर बंट जाता है, रिवर्स एक LINQ चीज है जो इनपुट को उलट देती है और फिर हमारे पास बस थोड़ा सा तर्क होता है जो पूछता है कि क्या अंतिम (^ 1 इंडेक्स और सी # 9 की रेंज फीचर से है, जिसका अर्थ है "इनमें से एक end") चार एक बिंदु है, इसे प्रारंभ में ले जाएं (एक बिंदु को जोड़ दें और अंत से 1 तक की सभी स्ट्रिंग) अन्यथा केवल शब्द को आउटपुट करें ..

और जो कुछ बचा है, वह है स्ट्रिंग से जुड़ना, जो आप जानते हैं कि कैसे करना है: string.Join(" ", ...)

0
Caius Jard 15 जिंदा 2022, 23:02