string cmd = "Static hostname: gatewayIcon name: computer - desktopChassis: desktopMachine ID: 706ecaf18cea4c919eb515d0e73c7fe4Boot ID: c2f95d12ab334e57ac7e6503f7d0cd87Operating System: CentOS Linux 8(Core)CPE OS Name: cpe:/ o:centos: centos: 8Kernel: Linux 4.18.0 - 147.3.1.el8_1.x86_64Architecture: x86 - 64Thu Dec 30 15:31:24 EST 2021total used free shared buff / cache availableMem: 7887756 455084 4067136 427084 3365536 6746868Swap: 8183804 0 8183804Filesystem Size Used Avail Use % Mounted ondevtmpfs 3.8G 0 3.8G 0 % / devtmpfs 3.8G 84K 3.8G 1 % / dev / shmtmpfs 3.8G 417M 3.4G 11 % / runtmpfs 3.8G 0 3.8G 0 % / sys / fs / cgroup/ dev / mapper / cl - root 50G 3.2G 47G 7 % // dev / sda2 976M 188M 721M 21 % / boot/ dev / sda1 599M 6.8M 593M 2 % / boot / efi/ dev / mapper / cl - home 53G 12G 42G 22 % / hometmpfs 771M 200K 771M 1 % / run / user / 1000total 120G 15G 105G 13 % -procs---------- - memory------------ - swap------ - io---- - system--------cpu---- -r b swpd free buff cache si so bi bo in cs us sy id wa st2 0 0 4067108 4884 3360652 0 0 0 2 1 3 37 2 61 0 0";
diagtext = cmd;

split = Regex.Split(diagtext, @"%");

foreach (var item in split)
{
   diskmem = split[10];
}

तो मेरे पास cmd नामक यह लंबी स्ट्रिंग है और मैं प्रतिशत % (चिह्न) के आगे एक विशेष स्ट्रिंग प्रदर्शित करने के लिए रेगेक्स का उपयोग कर रहा हूं। मैं इस स्ट्रिंग को प्रदर्शित करने में सक्षम था: / run / user / 1000total 120G 15G 105G 13 %, लेकिन मुझे केवल 13 की आवश्यकता है, 13 से पहले के तार नहीं।

मैं यह कैसे कर सकता हूँ?

0
P-koy 13 जिंदा 2022, 17:56
आप रेगेक्स के बारे में सीखते हैं और इसे% पर विभाजित करने के बजाय स्ट्रिंग से जो चाहते हैं उसे पार्स करें। सुनिश्चित नहीं हैं कि आपका क्या मतलब है ('% / रन / उपयोगकर्ता / 1000total 120G 15G 105G 13%'?) और यह कैसे महत्वपूर्ण है। आप रिक्त स्थान पर diskmem को भी विभाजित कर सकते हैं और उनमें से अंतिम को ले सकते हैं - सिस्टम का उपयोग करके diskmem.Split(" ").Last() जैसा कुछ। लिंक को काम करना चाहिए - आपका foreach (var item in split) अनावश्यक बीटीडब्ल्यू है। जब आप पहली बार diskmem = split[10];
 – 
Patrick Artner
13 जिंदा 2022, 18:14

4 जवाब

सबसे बढ़िया उत्तर

split[] सरणी के प्रत्येक सूचकांक के लिए एक सफेद स्थान सीमांकक का उपयोग करके एक और विभाजन करें, resplit[] सरणी का अंतिम सूचकांक पहली सफेद जगह होने तक% चिह्न से पहले स्ट्रिंग होगा:

static void SomeMethod()
{
    string cmd = @"Static hostname: gatewayIcon name: computer - desktopChassis: desktopMachine ID:
                   706ecaf18cea4c919eb515d0e73c7fe4Boot ID: c2f95d12ab334e57ac7e6503f7d0cd87Operating System:
                   CentOS Linux 8(Core)CPE OS Name: cpe:/ o:centos: centos: 8Kernel: Linux 4.18.0 - 147.3.1.el8_1.x86_64Architecture: x86
                   - 64Thu Dec 30 15:31:24 EST 2021total used free shared buff / cache availableMem:
                   7887756 455084 4067136 427084 3365536 6746868Swap: 8183804 0 8183804Filesystem Size
                   Used Avail Use % Mounted ondevtmpfs
                   3.8G 0 3.8G 0 % / devtmpfs 3.8G 84K 3.8G 1 % / dev / shmtmpfs 3.8G 417M 3.4G 11 % / runtmpfs
                   3.8G 0 3.8G 0 % / sys / fs / cgroup/ dev / mapper / cl
                   - root 50G 3.2G 47G 7 % // dev / sda2 976M 188M 721M 21
                   % / boot/ dev / sda1 599M 6.8M 593M 2 % / boot / efi/ dev
                   / mapper / cl - home 53G 12G 42G 22 % / hometmpfs 771M 200K
                   771M 1 % / run / user / 1000total 120G 15G 105G 13
                   % -procs---------- - memory------------ - swap------ - io---- - system--------cpu---- -r b
                   swpd free buff cache si so bi bo in cs us sy id wa st2 0 0 4067108 4884 3360652 0 0 0 2 1 3 37 2 61 0 0";
    diagtext = cmd;    
    split = Regex.Split(diagtext, @"%");    
    var resplit = split[10].Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
    // OUTPUT: '13'
    string finalResult = resplit[resplit.Length - 1];        
}
3
jonathana 13 जिंदा 2022, 19:44

आप कुछ पैटर्न को याद कर रहे हैं जिसका उपयोग हम एक सुसंगत परिणाम प्राप्त करने के लिए कर सकते हैं, लेकिन यह मानते हुए कि आपके द्वारा पार्स की गई स्ट्रिंग आपके द्वारा दिखाए गए नमूना स्ट्रिंग के अनुसार अंतिम है, आप अंतिम का अंतिम मान प्राप्त करने के लिए Split का उपयोग कर सकते हैं split स्ट्रिंग:

//...
var split = Regex.Split(diagtext, @"%"); // your code

var target = split.ElementAt(split.Length - 2).Split(); //split the string
var val = target.ElementAt(target.Length - 2); //isolate the value 13

लाइव डेमो

या

var target = split.ElementAt(split.Length - 2).Split()
    .Where(p => p != string.Empty).ToArray();
//...

यदि आप रिक्त स्थान छोड़ना चाहते हैं।

2
anastaciu 13 जिंदा 2022, 19:17

मैं टिप्पणी करने के लिए जोर से नहीं हूं, इसलिए मैं अपनी टिप्पणी इस उत्तर में डालूंगा। इस प्रश्न का ठीक से उत्तर देने के लिए डेटा संरचना के बारे में थोड़ी अधिक जानकारी की आवश्यकता है, लेकिन पहली नज़र में, ऐसा लगता है कि आप इस स्ट्रिंग को रिक्त स्थान से विभाजित कर सकते हैं और 10 वां आइटम ले सकते हैं। एक और नोट पर, मैं जानना चाहता हूं कि आप फ़ोरैच लूप का उपयोग क्यों कर रहे हैं। आप var आइटम का उपयोग नहीं कर रहे हैं।

string[] items = diskmem.Split(' ');
1
Alex T. 13 जिंदा 2022, 18:12

आप किसी भी % प्रतीकों से पहले सभी प्रतिशत गणना प्राप्त करने के लिए इस रेगेक्स स्ट्रिंग का उपयोग कर सकते हैं:

([\d]{1,3})\s%
0
NoConnection 13 जिंदा 2022, 18:08
इसलिए, मैंने पहले ही उस स्ट्रिंग को पिन कर दिया है जिसकी मुझे आवश्यकता है जो कि [10] पर "13" है। मैं सिर्फ 13 को प्रदर्शित करना चाहता था न कि इससे पहले के तार। आपको धन्यवाद
 – 
P-koy
13 जिंदा 2022, 18:12
ऐसा करने के लिए आप पहले से निकाले गए स्ट्रिंग के मेरे उत्तर में रेगेक्स लागू कर सकते हैं और पहले मैच का उपयोग कर सकते हैं, जो इस मामले में "13" होगा।
 – 
NoConnection
13 जिंदा 2022, 18:22
हालांकि मैं आपको सलाह दूंगा कि आप "%" पर विभाजित करने के बजाय रेगेक्स का उपयोग करके पूरी प्रारंभिक स्ट्रिंग को पार्स करें, क्योंकि ऐसा लगता है कि स्ट्रिंग में प्रविष्टियों का क्रम बदल सकता है या स्ट्रिंग में अतिरिक्त ड्राइव दिखाई दे सकते हैं।
 – 
NoConnection
13 जिंदा 2022, 18:23